2017-03-01 10 views
0

나는 매우 유사 다음 두 가지 방법이 있습니다하나의 방법까지 두 가지 방법에서이 코드를 리팩토링하는 방법

  def space_before_element?(start_element) 
       element = start_element.previous_element 
       until element.nil? || 
       (element.name == start_element.name || "r" && !element.text.empty?) 
        element = element.previous_element 
       end 
       character = element 
          .text 
          .split(/(\W)/) 
          .compact 
          .reject(&:empty?) 
          .last 
          .last_character \ 
          unless element.nil? 

       element.nil? || 
       (character.punctuation? && !character.hyphen? && !character.apostrophe?) || 
       character.spaces? 
       end 


      def space_after_element?(start_element) 
       element = start_element.next_element 
       until element.nil? || 
       (element.name == start_element.name || "r" && !element.text.empty?) 
        element = element.next_element 
       end 
       character = element 
          .text 
          .split(/(\W)/) 
          .compact 
          .reject(&:empty?) 
          .last 
          .first_character \ 
          unless element.nil? 

       element.nil? || 
       (character.punctuation? && !character.hyphen? && !character.apostrophe?) || 
       character.spaces? 
       end 

내가 허용 할 필요한 사항을 변경하는 방법을 알아낼 수없는 것을 나 한 가지 방법으로 이것을 줄이기 위해.

아직 내 루비 기술을 계속 사용하고 있습니다.

도움을 주시면 감사하겠습니다. 루비 2.2.3

+0

모든'**'의 무엇인가? 유효한 Ruby 코드 만 포함시켜야합니다. (나는 그것이 downvote의 이유라고 기대한다.) 또한, 코드를 읽으려면 가로로 스크롤해야 할 때, 독자가 포함되어있는 일부 독자는 짜증이났다. 선을 끊어서 불필요한 것은 어떨까요? –

+0

차이점을 더 쉽게 볼 수 있도록 여기 제공된 도구를 사용하여 다른 방법으로 항목을 굵게 표시하려고했습니다. 나는 너의 충고를 따르고 그것을 필요로하지 않도록 위로 끊을 것이다. 사과. – chell

+0

정의 된 클래스는 어떤 클래스입니까? –

답변

4

세 가지 차이가 ​​있습니다. 따라서, 이러한 차이는 명시 적으로 선언해야합니다

METHODS = { 
    prev: [:previous_element, %i|last last_character|], 
    next: [:next_element, %i|first first_character|] 
}.freeze 

지금 우리는 단지 메서드에 매개 변수를 전달 :

def space_around_element?(start_element, prev_or_next = :prev) 
    element = start_element.public_send(METHODS[prev_or_next].first) 
    # same code 
    character = element 
       .text 
       .split(/(\W)/) 
       .reject(&:empty?) 
       .public_send(METHODS[prev_or_next].last.first) 
       .public_send(METHODS[prev_or_next].last.last) \ 
     unless element.nil? 
    # same code 
    end 
+0

이 답변으로 많은 것을 배우고 있습니다 덕분에 당신의 도움에 대단히 감사합니다. – chell

+0

당신은 오신 것을 환영합니다. – mudasobwa