Ho pensato che una delle pietre miliari di OOP è che abbiamo oggetti, che sono gli oggetti a cui siamo interessati e che quindi inviamo loro messaggi.
Quindi può sembrare naturale che io abbia una collezione di oggetti, e ho bisogno di metterli in una stringa, quindi per farlo:
["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby
(Smalltalk lo fa allo stesso modo). Il " | "
è in qualche modo pensato come argomento, un token di come unirlo. Può anche essere " "
, se il tabellone deve essere più semplice. Quindi l'elemento di unione " | "
non è particolarmente qualcosa a cui abbiamo interesse - non sono gli oggetti principali del programma che hanno un'importanza o un significato particolare.
Se Python lo usa usando
" | ".join(["x", "o", "o"])
Sembra un po 'strano che ci si senta quasi come se stessimo passando un messaggio alla discussione, per dire la discussione su qualcosa. Forse Python è più procedurale? Per dire alla stringa di unione di eseguire qualche dovere per noi?
È per salvare l'implementazione, in modo da non dover definire un join
per ogni classe di raccolta che abbiamo? Ma non è vero che possiamo anche scrivere una sola volta per qualsiasi classe di raccolta, come in Ruby:
module Enumerable
def my_join(joiner)
self.inject {|a,b| a.to_s + joiner + b.to_s}
end
end
(qualcosa di simile a questo, chiamando to_s
su ogni elemento, facendo affidamento sul to_s
di ogni classe per fare la propria cosa, per convertire in una stringa e quindi concatenarli). Quindi, non dobbiamo implementare per ogni stringa, hash o set o qualsiasi altra classe di raccolta che abbiamo.
O Python ha ragione, non segue la rotta OOP? Usa len("abc")
e type([])
invece di "abc".len()
o [].type()
anche in Python3 sembra. Python lo fa in questo modo per un motivo di progettazione?