Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

엣지 케이스가 완벽한 솔루션에 구멍을 뚫을 때

미친 테스트 문제에 대한 완벽한 솔루션을 찾았습니다. DEFAULT_HOST를 재정의하기만 하면 됩니다. 계속해서 사업을 하게 될 것입니다.

그 추악한 메시지를 없애기 위해 경고를 꺼야한다는 점을 제외하고. 하지만 지금 모든 테스트를 통과했으며 몇 줄의 코드만 변경하면 됩니다!

당신이 하지 않는 한 가지 테스트를 제외하고 호스트를 무시하고 싶습니다. 그러나 상수를 다시 재정의하고 경고를 다시 끄고 테스트가 끝나면 재설정되도록 할 수 있습니다. 작업이 거의 완료되었습니다. 거의 맛볼 수 있습니다!

제외... 제외... 제외...

그리고 며칠 후 27번 째 꼼짝도 하지 않고 앱이 하나의 거대한 핵덩어리가 되었을 때 가만히 앉아서 다음과 같은 생각을 하게 될 것입니다. 내가 하고 있는 이유 이 모든 것이? 문제보다 해결책이 더 좋지 않습니까?

너무 영리한 문제를 해결하는 방법

당신의 독창적인 아이디어가 당신의 전체 문제를 해결하지 못할 것이 분명합니다. 그렇다면 어떻게 더 나은 아이디어, 당신의 독창적인 아이디어가 할 수 없었던 모든 극단적인 경우를 해결합니까?

당신은 할 수 없습니다. 너무 많은 영리함과 더 많은 영리함으로 싸울 수는 없습니다. 적어도 직접적으로는 아닙니다. 대신 다른 길로 가십시오. 간단하게 진행하세요. 직진하세요.

그게 무슨 뜻인가요?

추상화하려는 코드를 인라인하십시오. 자신을 반복합니다. 코드를 명시적으로 유지하십시오.

DEFAULT_HOST를 재정의하려는 경우 다른 기본 호스트로 상수를 사용하는 경우 기본값에 대한 전체 개념을 잊어버리십시오. 매번 지정하기만 하면 됩니다.

따라서 다음 대신:

테스트/통합/welcome_test.rb
require 'test_helper'

silence_warnings do
  Rack::Test::DEFAULT_HOST = "www.justinweiss.com"
end

class WelcomeTest < ActionDispatch::IntegrationTest
  include Rack::Test::Methods
  
  test "can visit the homepage" do
    get "/"
    # ...
  end

  # ...
end

다음과 같이 하십시오:

테스트/통합/welcome_test.rb
require 'test_helper'

class WelcomeTest < ActionDispatch::IntegrationTest
  test "can visit the homepage" do
    get "https://www.justinweiss.com/"
    # ...
  end
  # ...
end

완벽해 보이는 솔루션이 실패할 때마다 결국 처리해야 할 극단적인 경우를 상상하지 못했기 때문입니다.

괜찮아. 우리는 미래를 예측할 수 없습니다. 그러나 그것이 일어나고 있음을 알게되면 파기를 중지하십시오. 패치 후 패치만 적용하지 마세요. 대신 원래 솔루션을 풀고 추출하세요. 더 나은 것입니다.

더 나은 솔루션을 추출하는 방법

모든 코드를 명확하고 직접적인 방식으로 작성했다면 코드를 재구성할 방법을 생각하기 시작할 것입니다.

일반적으로 Extract Method 또는 Extract Class를 적절한 위치에 적용하면 충분합니다. 비결은 그 올바른 장소가 무엇인지 결정하는 것입니다. 하지만 바로 앞에서 반복되는 내용을 보면 훨씬 쉽게 알아낼 수 있습니다.

그리고 상속과 위임에 의존하십시오. 너무 똑똑하지 않으면서 코드를 정리하는 데 도움이 되는 간단한 구성 요소입니다.

하나 더

문서를 읽는 것을 잊지 마십시오:

테스트/통합/welcome_test.rb
require 'test_helper'

class WelcomeTest < ActionDispatch::IntegrationTest

  setup do
    # This already exists:
    host! "www.justinweiss.com"
  end
  
  test "can visit the homepage" do
    get "/"
    # ...
  end
  # ...
end

대답은 항상 그렇게 명확하지 않을 것입니다. 하지만 세 가지 클래스를 작성하고 해결해야 할 보석과 같은 문제에 대한 한 가지 방법의 내장 솔루션이 있다는 사실을 깨닫는 것보다 더 겸손한 일은 없습니다.

결국 더 나은 솔루션

두 번째 솔루션은 일반적으로 모든 면에서 더 좋습니다. 원래 것보다.

그 이유는 무엇입니까?

  • 개발자로서의 경험이 더 많습니다.

    따라서 좋은 코드가 무엇인지 더 잘 알 수 있습니다.

  • 당신은 당신이 구축한 시스템에 대해 더 많이 알고 있습니다.

    따라서 작성 중인 코드가 코드에 어떻게 들어맞는지 더 나은 결정을 내릴 수 있습니다.

  • 어떤 가정이 틀렸는지 알고 있습니다.

    따라서 귀하의 솔루션은 귀하가 가능성이 있는 상상했던 문제가 아니라 존재하는 실제 문제에 더 잘 맞을 수 있습니다. 존재합니다.

그리고 결국에는 최고의 영리함을 되찾을 수 있는 곳이 있을 수 있습니다. 이번에는 해킹 없이.

파는 것을 멈춰야 합니다

영리한 코드는 작성하는 것이 즐겁습니다. Ruby에서는 쓰기도 쉽습니다. 또한 잘못된 길로 가고 있다는 것을 알면서도 계속 진행하기가 특히 쉽습니다.

그러나 무언가가 옳지 않다는 잔소리를 들으면 잠시 멈추십시오. 코드를 분해합니다. 문서를 읽으십시오. 코드를 간단하고 명시적으로 만드십시오. 더 나은 방법을 찾으세요.

끝나지 않을 구덩이를 계속 팠던 마지막 때가 기억나나요? 당신은 어땠나요? 그것에서 자신을 얻을? 그리고 최종적으로 완성된 코드는 어떻게 생겼나요?