programing

루비에서 명시적으로 반품하는 것이 좋은 스타일입니까?

sourcejob 2023. 6. 23. 22:02
반응형

루비에서 명시적으로 반품하는 것이 좋은 스타일입니까?

스타일에 관해서는 항상 "올바른 방법"("파이썬" 방식)이 있는 파이썬 배경에서 온 저는 루비에게도 같은 것이 존재하는지 궁금합니다.저는 제 스타일 가이드라인을 사용해 왔지만 소스 코드를 공개할 생각입니다. 그리고 저는 그것이 존재할 수 있는 불문율을 준수해야 합니다.

분명히 타이핑하는 것이 "루비 웨이"인가요?return방법으로?유무상통하는 것을 보았습니다만, 올바른 방법이 있을까요?그것을 하기에 적당한 때가 있습니까?예:

def some_func(arg1, arg2, etc)
  # Do some stuff...
  return value # <-- Is the 'return' needed here?
end

오래된 (그리고 "답답"한) 질문이지만, 저는 답으로 2센트를 던질 것입니다.

TL;DR - 그럴 필요는 없지만 경우에 따라 코드를 훨씬 더 명확하게 만들 수 있습니다.

명시적인 반환을 사용하지 않는 것이 "루비 방식"일 수 있지만, 익숙하지 않은 코드로 작업하는 프로그래머나 루비의 이 기능에 익숙하지 않은 프로그래머에게는 혼란스럽습니다.

이것은 다소 꾸며진 예이지만, 이런 작은 기능을 가지고 있다고 상상해 보세요. 전달된 숫자에 하나를 더해서 인스턴스 변수에 할당하는 것입니다.

def plus_one_to_y(x)
    @y = x + 1
end

이것은 값을 반환하는 함수를 의미합니까, 아닌가요?개발자가 인스턴스 변수를 할당하고 할당된 값도 반환하기 때문에 개발자가 의미하는 바를 말하기가 정말 어렵습니다.

훨씬 나중에 다른 프로그래머(아마도 Ruby가 실행된 코드의 마지막 줄을 기준으로 어떻게 반환하는지 잘 모를 수도 있음)가 와서 로깅을 위해 몇 가지 인쇄문을 넣으려고 하면 함수가 이것이 된다고 가정합니다.

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
end

이제 반환된 값을 기대하는 것이 있으면 기능이 중단됩니다.반환된 값을 기대하는 것이 없다면 괜찮습니다.분명히 코드 체인 아래 어딘가에서, 이것을 부르는 무언가가 반환된 값을 기대하고 있다면, 그것은 그것이 기대하는 것을 되찾지 못하기 때문에 실패할 것입니다.

이제 진짜 질문은 이것입니다. 정말로 반환되는 가치를 기대했던 것이 있었는가 하는 것입니다.이것이 무언가를 깨트렸나요, 아닌가요?그것이 미래에 무언가를 깨뜨릴까요?누가 알겠어!모든 통화에 대한 전체 코드 검토만 알려줍니다.

그래서 적어도 저에게 가장 좋은 방법은 중요한 것이 있다면 무엇인가를 반환한다는 것을 매우 분명하게 말하는 것입니다. 아니면 중요하지 않을 때는 아무것도 반환하지 않는 것입니다.

그래서 우리의 작은 데모 기능의 경우, 우리가 값을 반환하기를 원한다고 가정하면, 이렇게 쓰여질 것입니다.

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
    return @y
end

그리고 프로그래머들에게 그것이 가치를 돌려준다는 것은 매우 분명할 것이고, 그들이 그것을 깨닫지 못하고 깨기는 훨씬 더 어려울 것입니다.

아니면 이렇게 쓰고 반품명세서를 생략할 수도 있습니다.

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
    @y
end

하지만 왜 리턴이라는 단어를 빼놓을까요?그냥 거기에 넣고 무슨 일이 일어나고 있는지 100% 분명히 하는 게 어때요?이는 문자 그대로 코드의 수행 능력에 영향을 미치지 않습니다.

아니요. 좋은 루비 스타일은 일반적으로 빠른 반품을 위해 명시적인 반품만 사용합니다.Ruby는 코드 미니멀리즘/암묵적 마법에 관심이 많습니다.

그렇긴 하지만, 만약 명시적인 반환이 사물을 더 명확하게 하거나 읽기 쉽게 한다면, 그것은 아무 것도 해치지 않을 것입니다.

저는 개인적으로 사용합니다.return키워드를 사용하여 주로 반환 값을 위해 실행되는 방법과 주로 부작용을 위해 실행되는 절차적 방법을 구분합니다.그래서, 반환값이 중요한 방법들은, 여분을 얻습니다.return반환 값에 주의를 끌 키워드를 지정합니다.

저는 메소드를 호출할 동일한 구분을 사용합니다. 함수 메소드는 괄호를 받지만 절차 메소드는 그렇지 않습니다.

으로 중요한 것은, 저는 과 그 합니다: 은 곱슬곱슬하게 하고은 ( ") 그고마로으것은중한요막지다니즉리용합사저그구는별블을과록얻블하블습니다만록중절록게하는기은능차곱고무를가들슬언를괄호은블록곱슬▁and:)▁that▁(즉,▁withinction▁iural▁proced▁blocks▁dist▁blocks▁that▁get▁get▁notal▁function▁use▁also▁least▁blocks,▁last▁curly▁bracesi"▁but얻do▁"블습니그다하)록.do/end.

하지만, 저는 그것에 대해 종교적이지 않으려고 노력합니다: 블록, 곱슬곱슬한 교정기 그리고.do/end우선 순위가 다르며, 명시적인 괄호를 추가하여 표현식의 모호성을 없애는 대신 다른 스타일로 전환합니다.메소드 호출도 마찬가지입니다. 매개 변수 목록 주위에 괄호를 추가하면 코드를 더 읽기 쉽게 만들 수 있습니다. 문제의 메소드가 본질적으로 절차적일지라도 저는 그렇게 합니다.

사실 중요한 것은 다음을 구별하는 것입니다.

  1. 함수 - 반환 값에 대해 실행되는 메서드
  2. 절차 - 부작용을 위해 실행되는 방법

Ruby는 이것들을 구별할 수 있는 기본적인 방법이 없기 때문에 절차를 작성하는 데 취약합니다.side_effect()프로시저의 암묵적인 반환 값을 남용하기로 결정한 또 다른 개발자.

이 문제를 해결하려면 스칼라와 해스켈의 책을 본받아 절차를 명시적으로 반환해야 합니다.nil (일명)Unit또는()다른 언어로).

하면 명시적으로 사용할 수 요. 적시사명을 합니다.return구문론이 단지 개인적인 스타일의 문제가 되는 것이 아닙니다.

기능과 절차를 추가로 구분하려면:

  1. , 블록은 프로시저 블록은 프로시저 블록으로 쓰는 W 미타그의 아이디어를 합니다.do/end
  2. 프시저호때할출을 합니다.() 마세요.

W 그했습니다 - 요르그 W 미타그를 피했습니다.()절차의 경우 s - 그러나 부작용 방법 호출이 변수와 명확하게 구별되기를 원하기 때문에 권장되지 않습니다. 특히 패리티가 0인 경우에는 더욱 그렇습니다.자세한 내용은 메서드 호출에 대한 스칼라 스타일 가이드를 참조하십시오.

스타일 가이드에는 사용해서는 안 된다고 나와 있습니다.return당신의 마지막 진술서에.마지막이 아니면 계속 사용할 수 있습니다.이것은 커뮤니티가 엄격하게 따르는 관례 중 하나이며, 루비를 사용하는 모든 사람과 협력할 계획이라면 당신도 그래야 합니다.


는 하지만, 명시적인 명, 사에대한을 하는 것에 returns는 다른 언어에서 온 사람들에게 혼란을 준다는 것입니다.

  • 첫째로, 이것은 전적으로 루비만의 것이 아닙니다.예를 들어 Perl에도 암묵적인 반환이 있습니다.
  • 두 번째로, 이것이 적용되는 사람들의 대다수는 알골어족입니다.대부분은 루비보다 훨씬 "낮은 수준"이기 때문에 무언가를 하기 위해서는 더 많은 코드를 작성해야 합니다.

Java에서 메서드 길이(게터/세터 제외)에 대한 일반적인 휴리스틱은 하나의 화면입니다.이 경우 메소드 정의가 표시되지 않거나 반환되는 위치를 이미 잊어버렸을 수 있습니다.

반면, 루비에서는 10줄 미만의 방법을 고수하는 것이 가장 좋습니다.그런 점을 감안할 때, 명확하게 암시된 진술서를 왜 10%까지 더 작성해야 하는지 의문이 들 것입니다.


Ruby는 void 방법이 없고 모든 것이 훨씬 더 간결하기 때문에 명시적으로 진행하면 이점이 전혀 없는 오버헤드를 추가할 뿐입니다.returns의

저는 Ben Hughes와 Tim Holt의 의견에 동의하지 않습니다. 왜냐하면 질문은 Python이 그것을 하는 결정적인 방법을 언급하고 Ruby가 비슷한 표준을 가지고 있는지를 묻기 때문입니다.

그래요.

이것은 루비로 문제를 디버깅할 것으로 예상되는 모든 사람이 그것에 대해 알 것으로 예상되는 언어의 매우 잘 알려진 특징입니다.

어떤 스타일을 가장 선호하느냐가 문제입니다.메소드 중간 어딘가에서 반환하려면 키워드 return을 사용해야 합니다.

벤이 말한 것처럼.'Ruby 메서드의 반환 값은 함수 본문의 마지막 문의 반환 값'이라는 사실은 대부분의 루비 메서드에서 반환 키워드를 거의 사용하지 않게 합니다.

def some_func_which_returns_a_list( x, y, z)
  return nil if failed_some_early_check


  # function code 

  @list     # returns the list
end

언급URL : https://stackoverflow.com/questions/1023146/is-it-good-style-to-explicitly-return-in-ruby

반응형