2009-03-02 33 views
7

Họ có mâu thuẫn không?Tách rời YAGNI

Tách rời là thứ tuyệt vời và khá khó đạt được. Tuy nhiên, trong hầu hết các ứng dụng, chúng tôi không thực sự cần nó, vì vậy tôi có thể thiết kế các ứng dụng kết hợp cao và hầu như sẽ không thay đổi bất kỳ thứ gì khác ngoài các hiệu ứng phụ rõ ràng như "bạn không thể tách rời các thành phần", " ass "v.v.

Bạn nghĩ sao? Bạn luôn luôn cố gắng để decouple và đối phó với chi phí?

Trả lời

7

Dường như tôi tách rời và YAGNI có rất nhiều đức tính bổ sung. (Tôi chỉ nhận thấy câu trả lời của Rob, và có vẻ như chúng ta đang ở cùng một trang ở đây.) Câu hỏi đặt ra là bạn nên làm bao nhiêu, và YAGNI là một nguyên tắc tốt để giúp xác định câu trả lời. (Đối với những người nói về thử nghiệm đơn vị - nếu bạn cần tách rời để làm bài kiểm tra đơn vị của bạn, thì YAGNI rõ ràng không áp dụng.)

Tôi thực sự nghi ngờ những người nói rằng họ "luôn" tách biệt. Có lẽ họ luôn làm mọi lúc họ nghĩ về nó. Nhưng tôi chưa bao giờ thấy một chương trình mà các lớp trừu tượng bổ sung không thể được thêm vào đâu đó, và tôi chân thành nghi ngờ có một ví dụ không tầm thường về một chương trình như vậy ở ngoài kia. Mọi người vẽ một đường ở đâu đó.

Từ kinh nghiệm của mình, tôi đã tách mã và sau đó không bao giờ tận dụng được tính linh hoạt bổ sung về tần suất tôi đã để lại và sau đó phải quay lại và thay đổi nó sau. Tôi không chắc liệu điều đó có nghĩa là tôi đã cân bằng hay bị chia đều theo cả hai hướng.

2

Tôi (hầu như) luôn tách rời. Mỗi khi tôi làm điều này tôi thấy nó hữu ích, và (hầu như) mỗi lần tôi không phải làm sau. Tôi cũng đã tìm thấy nó một cách tốt để giảm số lượng lỗi.

0

Vâng, YAGNI là ít hơn một cụm từ đơn giản không có thật ném xung quanh. Tuy nhiên, tách là một khái niệm khá rõ ràng. YAGNI dường như ngụ ý rằng một loại là một loại tâm linh. Nó chỉ là lập trình bởi cliche, đó là không bao giờ là một ý tưởng tốt. Thành thật mà nói, có một trường hợp được thực hiện rằng YAGNI có lẽ không liên quan đến việc tách rời. Coupling thường là "nhanh hơn" và "những người hiểu biết nếu bạn là bạn sẽ cần một giải pháp tách rời, bạn sẽ không thay đổi thành phần X anyway!"

+0

YAGNI ngụ ý rằng một là _not_ một số loại tâm linh - xem http://c2.com/cgi/wiki?YouArentGonnaNeedIt –

+0

Tôi biết chính xác nó là gì nhưng bạn chỉ đang chơi một trò chơi với nó. Nhưng bạn cho thấy lý do tại sao nó là một cụm từ ngớ ngẩn. Nếu bạn muốn tranh luận về việc liệu YAGNI có bị rối loạn tâm linh hay chỉ là cận thị, tôi sẽ không làm điều đó bởi vì đó là một cuộc thảo luận vô ích, vô nghĩa. – BobbyShaftoe

2

Tách để tách có thể không tốt. Xây dựng các thành phần có thể thử nghiệm là rất quan trọng.

Phần khó khăn của câu chuyện là biết khi nào và bao nhiêu tách bạn cần.

+0

Tại sao bạn nói tách vì lợi ích của nó có thể là xấu? – tddmonkey

+1

Tôi có nghĩa là tách mà không có một lợi ích thực sự nhưng chỉ đơn giản là để làm điều đó, ngay cả khi nó mất nhiều thời gian hơn. – cherouvim

+0

Rất tốt. Và nếu bạn sử dụng phát triển định hướng thử nghiệm (bạn nên!), Tách là ngay lập tức cần thiết. – Offirmo

0

Như thẻ của bạn cho biết, thẻ này rất chủ quan. Nó dựa hoàn toàn vào trí tuệ kỹ thuật của riêng bạn để quyết định những gì bạn "không cần". Bạn có thể cần ghép nối trong một trường hợp, nhưng bạn sẽ không phải trong một trường hợp khác. Ai sẽ nói? Bạn, tất nhiên.

Để có quyết định mang tính chủ quan, thì không thể có nguyên tắc chỉ định.

+0

Cảm ơn câu trả lời, tôi không tìm kiếm một hướng dẫn như tôi đã nói tôi tò mò về những gì người khác đang làm. Ý tưởng của bạn về chủ đề này là gì và khi nào/bạn rơi vào trường hợp nào và không cảm thấy thích nó. Xin lỗi nếu điều đó không rõ ràng về câu hỏi. –

2

Tôi muốn nói là không. Việc tách là giảm các phụ thuộc không cần thiết trong mã và siết chặt các truy cập thông qua các giao diện sạch, được xác định rõ. "Bạn sẽ không cần nó" là một nguyên tắc hữu ích mà thường tư vấn cho kiến ​​trúc quá rộng và quá rộng của một giải pháp mà không có trường hợp sử dụng rõ ràng và hiện tại.

Kết quả thực tế trong số này là bạn có một hệ thống dễ dàng hơn trong việc tái cấu trúc và duy trì các thành phần riêng lẻ mà không gây ra hiệu ứng gợn sóng trên toàn bộ ứng dụng và không có khía cạnh phức tạp không cần thiết cho thiết kế. đơn giản như được yêu cầu để đáp ứng các yêu cầu hiện tại.

0

YAGNI sự lộn xộn :) ... thực sự, chúng tôi không cần phải có tất cả mã được trộn lẫn để chuyển sang "nhanh hơn".

Các bài kiểm tra đơn vị thực sự giúp cảm giác khi nó được kết hợp (cho một người hiểu rõ thử nghiệm đơn vị so với các loại kiểm tra khác) là gì. Thay vào đó, nếu bạn làm điều đó với tư duy "bạn không thể tách riêng thành phần", bạn có thể dễ dàng thêm nội dung mà bạn không cần :)

Tôi sẽ nói rằng YAGNI đến khi bạn bắt đầu xoay và thay đổi logic tất cả xung quanh ngoài các kịch bản sử dụng thực tế mà cuộc gọi triển khai hiện tại thực hiện. Giả sử bạn có một số mã sử dụng một vài nhà cung cấp thanh toán bên ngoài mà cả hai đều làm việc với các chuyển hướng đến một trang web bên ngoài. Có một thiết kế giữ mọi thứ sạch sẽ, nhưng tôi không nghĩ rằng việc bắt đầu nghĩ đến các nhà cung cấp mà chúng tôi không biết liệu có được hỗ trợ nhiều cách khác nhau để xử lý sự tích hợp và liên quan hay không quy trình làm việc.

1

Nếu "thử nghiệm đơn vị là một cơn đau ở mông" thì tôi có thể nói rằng bạn cần làm. Phần lớn thời gian tách có thể đạt được với chi phí gần như bằng không, vậy tại sao bạn không muốn làm điều đó?

Bên cạnh đó, một trong những bugbears lớn nhất của tôi khi làm việc trên một codebase mới phải tách mã trước khi tôi có thể bắt đầu viết bài kiểm tra đơn vị khi sự ra đời của một giao diện ở đâu đó hoặc sử dụng dependency injection có thể tiết kiệm rất nhiều thời gian

+0

Làm thế nào bạn có thể đạt được tách với chi phí gần như bằng không? Đó là hầu như không thể trong tâm trí của tôi. Tôi tò mò về điều này, bởi vì tôi nghĩ rằng hầu hết mọi người đồng ý rằng tách là khá khó khăn để đạt được. Đặc biệt là ngay cả khi những thứ đơn giản nhất như đọc cấu hình cũng cần phải có dep. tiêm –

+0

tiêm phụ thuộc nên được thực hiện như là một vấn đề của khóa học (và sẽ được nếu bạn đang thử nghiệm đơn vị đúng cách). Bạn không cần một container DI để đạt được điều này nhưng sẽ thấy bạn viết một số mã boilerplate để đạt được nó. Guice cung cấp cho bạn DI thiết lập rất ít và có thể được trang bị khá dễ dàng – tddmonkey

4

YAGNI là quy tắc chung (không phải là tôn giáo). Tách là nhiều hơn hoặc ít hơn một kỹ thuật (cũng không phải là một tôn giáo). Vì vậy, họ không thực sự liên quan, cũng không làm họ mâu thuẫn nhau.

YAGNI là về chủ nghĩa thực dụng. Giả sử bạn không cần cái gì, cho đến khi bạn làm.

Thường giả sử kết quả YAGNI tách ra. Nếu bạn không áp dụng con dao đó chút nào, bạn sẽ kết luận rằng bạn cần phải có các lớp biết tất cả về hành vi của nhau trước khi bạn chứng minh điều đó là đúng.

"Decouple" (hoặc "loose couple") là động từ, do đó, nó yêu cầu công việc. YAGNI là một giả định, mà bạn điều chỉnh khi bạn thấy rằng nó không còn đúng nữa.

Các vấn đề liên quan