Computer >> Máy Tính >  >> Lập trình >> Ruby

Khi các trường hợp cạnh chọc lỗ trong giải pháp hoàn hảo của bạn

Bạn đã tìm thấy giải pháp hoàn hảo cho vấn đề thử nghiệm điên rồ của mình. Tất cả những gì bạn phải làm là ghi đè DEFAULT_HOST không đổi và bạn sẽ kinh doanh.

Ngoại trừ việc bạn phải tắt cảnh báo để thông báo xấu xí đó biến mất. Nhưng bây giờ tất cả các bài kiểm tra của bạn đều vượt qua và bạn chỉ phải thay đổi một vài dòng mã!

Ngoại trừ một bài kiểm tra mà bạn không muốn ghi đè máy chủ. Nhưng bạn chỉ có thể ghi đè hằng số, tắt cảnh báo một lần nữa và đảm bảo rằng nó được đặt lại vào cuối quá trình kiểm tra. Bạn sắp hoàn thành rồi, bạn gần như có thể nếm thử!

Ngoại trừ… Ngoại trừ… Ngoại trừ…

Và một vài ngày sau, khi bạn gặp khó khăn lần thứ hai mươi bảy và ứng dụng của bạn đã trở thành một quả cầu tấn công khổng lồ, bạn sẽ ngồi lại và tự hỏi: Tại sao tôi lại làm tất cả điều này? Có phải giải pháp không tồi tệ hơn vấn đề?

Cách giải quyết vấn đề quá thông minh

Rõ ràng là ý tưởng ban đầu của bạn sẽ không giải quyết được toàn bộ vấn đề của bạn. Vì vậy, làm thế nào để bạn nghĩ ra một tốt hơn ý tưởng, giải quyết tất cả các trường hợp phức tạp mà ý tưởng ban đầu của bạn không thực hiện được?

Bạn không thể. Bạn không thể đấu tranh quá nhiều với sự khôn khéo hơn. Ít nhất, không phải trực tiếp. Thay vào đó, hãy đi theo hướng khác. Đơn giản. Hãy thẳng thắn.

Điều đó có nghĩa là gì?

Nội dòng mã bạn đang cố gắng trừu tượng hóa. Làm lặp lại chính mình. Giữ mã của bạn rõ ràng.

Nếu bạn đang cố gắng ghi đè một DEFAULT_HOST không đổi với một máy chủ mặc định khác, hãy quên toàn bộ ý tưởng về một máy chủ mặc định. Chỉ cần chỉ định nó mọi lúc.

Vì vậy, thay vì:

test / integration / 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

Làm điều gì đó như:

test / integration / welcome_test.rb
require 'test_helper'

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

Bất cứ khi nào các giải pháp dường như hoàn hảo của tôi bị hỏng, đó là vì tôi không hình dung ra những trường hợp khó cuối cùng mà tôi sẽ phải xử lý.

Được rồi. Chúng tôi không thể đoán trước được tương lai. Nhưng khi bạn nhận thấy nó đang xảy ra, hãy ngừng đào. Đừng chỉ áp dụng bản vá này đến bản vá khác. Thay vào đó, hãy rút lại giải pháp ban đầu của bạn và trích xuất một cái tốt hơn.

Cách trích xuất giải pháp tốt hơn

Khi tất cả mã của bạn được viết ra một cách rõ ràng, dễ hiểu, bạn sẽ bắt đầu nghĩ cách tổ chức lại nó.

Thông thường, chỉ cần áp dụng Phương pháp trích xuất hoặc Lớp trích xuất ở đúng nơi là đủ. Bí quyết là quyết định nơi phù hợp đó là gì. Nhưng việc tìm ra điều đó dễ dàng hơn rất nhiều khi bạn thấy rất nhiều sự lặp lại ngay trước mặt mình.

Và dựa trên sự kế thừa và ủy quyền. Đó là những khối xây dựng đơn giản sẽ giúp bạn làm sạch mã của mình mà không cần quá khéo léo.

Còn một điều nữa

Đừng quên đọc tài liệu:

test / integration / 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

Câu trả lời không phải lúc nào cũng rõ ràng như vậy. Nhưng không có gì khiêm tốn hơn việc nhận ra rằng có một giải pháp tích hợp một phương pháp cho vấn đề chính xác mà bạn đã viết ba lớp và một viên ngọc để giải quyết.

Cuối cùng thì một giải pháp tốt hơn

Giải pháp thứ hai của bạn thường sẽ tốt hơn về mọi mặt so với bản gốc của bạn.

Tại sao vậy?

  • Bạn có nhiều kinh nghiệm hơn với tư cách là nhà phát triển.

    Vì vậy, bạn sẽ có ý tưởng tốt hơn về những gì tạo nên mã tốt.

  • Bạn biết thêm về hệ thống mà bạn đã xây dựng.

    Vì vậy, bạn có thể đưa ra quyết định tốt hơn về cách mã bạn đang viết phù hợp với nó.

  • Bạn biết giả định nào của mình là sai

    Vì vậy, các giải pháp của bạn có thể phù hợp hơn với các vấn đề thực tế đang tồn tại, không phải những vấn đề bạn tưởng tượng có thể tồn tại.

Và cuối cùng, có thể có một nơi để những gì tốt nhất về sự thông minh của bạn phù hợp trở lại. Lần này, không cần đến hack.

Bạn phải ngừng đào

Mã thông minh là thú vị để viết. Trong Ruby, nó cũng dễ viết. Và đặc biệt dễ dàng tiếp tục đi xuống một con đường, ngay cả khi bạn biết rằng nó đang đưa bạn đến sai chỗ.

Nhưng một khi bạn cảm thấy khó chịu rằng có điều gì đó không ổn, hãy dừng lại một phút. Bỏ yếu tố mã của bạn. Đọc tài liệu. Làm cho mã của bạn đơn giản và rõ ràng. Và tìm một cách tốt hơn.

Bạn có thể nhớ lần cuối cùng bạn tiếp tục tự đào cho mình một cái hố không thể kết thúc không? Làm thế nào mà bạn thoát khỏi nó? Và đoạn mã bạn kết thúc trông như thế nào?