Tankar

Anta en URL.. som https://reisub.se. Om vi säger url = 'https://reisub.se', så är det inte längre en URL/URI.. det är en sträng.

Som sträng har den metoder.. som upcase. Jättebra för namn och orter.. men inte sådär jätteanvändbart för en URI.

Låt säga man vill hämta saker ur sin URI.. som host eller port. Då kanske man skriver sig en liten metod. Den metoden kanske man bara kastar in i kod som är main.

Så har vi en metod: get_host.
Och en till: get_port.

Dessa metoder vill ha indata. Så dom måste anropas med: get_host(en_url).

Vad får metoden för problem då? Jo, den måste kolla: ‘Vad får jag in?’. Är det n siffra?

Så indata måste checkas.
if indata == EN_URL ... THEN!

En del checkar med regexp. En del checkar med att jämföra typer. En del checkar genom att köra och fånga fel.

Men tänk om man slapp allt det där..

Tänk om METODEN var kopplad till TYPEN.

precis som 'arne'.upcase ger oss “ARNE”.. men 11.upcase inte fattar vad du pratar om.

class WebAddr
  require 'uri'
  def initialize(uri)
    @uri = URI.parse(uri)
    %i(scheme host port).each {|m|
      self.class.define_method(m) { @uri.send(m) }
    }
  end
end

addr = WebAddr.new('https://reisub.se')
p addr.scheme #=> "https"
p addr.host #=> "reisub.se"
p addr.port #=> "443"

addr är av typen WebAddr. Man kan inte köra upcase på den eller försöka multiplicera den med 8.

WebAddr har tre metoder: ‘scheme’, ‘host’ och ‘port’.
Inget annat.

Metoderna behöver inte checka indata eftersom klasssen ÄR metoder och klass-data… och DATA är instanser av klassen.
Varje instans kan sedan modifieras separat och få unika egenskaper.

Så min_url kan ha metoden best? medan din_url bara har metoden worst?.