Idealmente, dovresti evitare di avere getter o setter del tutto. Il principio fondamentale di OO è astrazione comportamentale , i tuoi oggetti dovrebbero fare cose, non solo cose "store".
Se assolutamente devi avere getter e setter, la cosa migliore da fare sarebbe attenersi alle convenzioni standard Ruby:
def content_type=(content_type_uid)
@content_type = content_type_uid
# do something with @content_type
end
Se ciò non è possibile, puoi provare a "sovraccaricare" il metodo basato su arity:
def content_type(content_type_uid = getter = true)
return @content_type if getter
@content_type = content_type_uid
# do something with @content_type
end
Se lo fai, dovresti cercare come documentare questo metodo come due distinti metodi "sovraccaricati" in qualunque sistema di documentazione tu stia usando. Per esempio. YARD ha un @overload
tag:
# @overload content_type
# Gets the content type
# @return [ContentType] The content type
# @overload content_type(content_type_uid)
# Sets the content type to +content_type_uid+
# @param content_type_uid [ContentType::Uid] The UID of the content type to set
def content_type(content_type_uid = getter = true)
return @content_type if getter
@content_type = content_type_uid
# do something with @content_type
end
Oppure, potresti usare il supporto di YARD per gli attributi / metodi sintetici:
# Sets the content type to +content_type_uid+
# @param content_type_uid [ContentType::Uid] The UID of the content type to set
def content_type(content_type_uid = getter = true)
return @content_type if getter
@content_type = content_type_uid
# do something with @content_type
end
# !attribute [r] content_type
# Gets the content type
# @return [ContentType] The content type
Nota comunque che questo "sovraccarico" ha uno svantaggio significativo: mentre puoi rappresentarlo nella documentazione, non c'è modo di rappresentarlo nella lingua. Quindi, quando tu (come faccio spesso) usi la reflection per esplorare alcune API non familiari, vedrai solo un metodo con un parametro opzionale senza alcuna indicazione del fatto che quell'unico metodo è in realtà due metodi diversi travestiti:
method(:content_type).parameters
#=> [[:opt, :content_type_uid]]
Normalmente, un parametro opzionale viene utilizzato per fornire, beh, argomenti facoltativi, non per passare da due comportamenti completamente diversi.