Mam pytanie o to jak restrykcyjnie podchodzicie do tej zasady. Ja pracuje w ruby niezbyt długo i czasami ciężko mi się stosować do tej reguły jednocześnie nadawać sensowne nazwy zmiennym i metodom.
I szczerze, gdym rozpoczynał nowy projekt, to nie wiem czy nie narzuciłbym sobie 100 znaków na linię…
Zalezy od projektu IMHO i ustalen miedzy zespolem - u Nas nie ma problemu aby bylo 120 bo wszyscy maja duze monitory. Staramy sie trzymac w 100tu ale jesli ktos wyjdzie nieco ponad to nie ma problemu
Szczerze staram się zamknąć w 100 - 120, ale nie trzymam się tej zasady za mocno. Czasem po prostu wolę utrzymać jedną linię zamiast dziwnego łamańca. Najdłuższa to chyba taki oto warunek if’a. Przy czym jak mam takie 2-3 na cały projekt to jest maks.
if params[:synchronization_report_job].present? && params[:synchronization_report_job][nested_attribute].present? && params[:synchronization_report_job][nested_attribute][:configuration_id].present?
80 znaków to zaprzeszłość historyczna związana z szerokością kart perforowanych a potem terminali. Spokojnie można to podbić do 120 znaków, chociaż lepiej żeby większość kodu była znacznie poniżej tego limitu.
Zawsze można się zastanowić nad uproszczeniem:
if ((params[:synchronization_report_job] || {})[nested_attribute] || {})[:configuration_id].present?
if params.fetch(:synchronization_report_job, {}).fetch(nested_attribute, {}).fetch(:configuration_id, nil).present?
if params.try(:[], :synchronization_report_job).try(:[], nested_attribute).try(:[], :configuration_id).present?
params[:synchronization_report_job] ||= {}
params[:synchronization_report_job][nested_attribute] ||= {}
if params[:synchronization_report_job][nested_attribute][:configuration_id].present?
Jak nie lubię monkey patchingu to tutaj chyba zrobiłbym wyjątek (pisane na kolanie, więc pewnie nie ogarnia wszystkich przypadków brzegowych):
class Hash
def nested_fetch(keys, default = nil)
if keys.size == 0
raise ArgumentError
elsif keys.size == 1
self.fetch(keys[0], default)
else
(self[keys.shift] || {}).nested_fetch(keys, default)
end
end
end
A ja dalej uważam że 80 znaków to jak najbardziej cel do którego powinniśmy dążyć. Argument że mamy duże monitory mnie nie przekonuje. Bardzo często zdarza mi się pracować na 13 calowym notebooku. Lubię też mieć dwa pliki otwarte obok siebie w split-view a wtedy 80 znaków na linię to zbawienie.
Sam mam ustawionego Rubocopa na 100 znaków per linia, bo tak jak już wspominałem uważam 80 znaków za cel a nie za ostateczny limit dlatego chciałbym żeby Rubocop dał mi niewielki bufor jak przekroczę ten limit o kilka znaków. Takie podejście staram się też propagować w swoim zespole.
Trzeba pamiętać, że coraz częściej kodujemy/czytamy w przeglądarce (np. nitrous.io itp.)
Github ma ograniczenie do ok. 110 znaków do czytania/edytowania kodu (trzeba scrollować horyzontalnie powyżej 110)
Ja preferuję czytelny kod w stylu:
is_config = params[:synchronization_report_job]
[nested_attribute]
[:configuration_id].present? rescue false
if is_config then ... end
Dodatkow w vim używam folding with markers aby zawijać nadmiarowe linie kodu