80 znaków w linii, jak bardzo restrykcyjnie?

Nie, nie chodzi o wywoływanie flam’a :wink:

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ę…

Jak wygląda wasza praktyka?

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 :smile:

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
irb(main):014:0> params = { foo: { bar: 123, baz: { hello: "world" } } }
irb(main):015:0> params.nested_fetch([:foo, :baz, :hello])
=> "world"
irb(main):017:0> params.nested_fetch([:foo, :bye, :hello], "hm...")
=> "hm..."

Dzięki za podpowiedź :smiley:

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