RẮN so với tránh trừu tượng sớm


27

Tôi hiểu những gì RẮN phải hoàn thành và sử dụng nó thường xuyên trong các tình huống mà tính mô đun là quan trọng và các mục tiêu của nó rõ ràng hữu ích. Tuy nhiên, có hai điều ngăn tôi áp dụng nó một cách nhất quán trên cơ sở mã của mình:

  • Tôi muốn tránh trừu tượng sớm. Theo kinh nghiệm của tôi, vẽ các đường trừu tượng mà không có trường hợp sử dụng cụ thể (loại tồn tại bây giờ hoặc trong tương lai gần ) dẫn đến chúng bị vẽ sai chỗ. Khi tôi cố gắng sửa đổi mã như vậy, các dòng trừu tượng sẽ gây cản trở hơn là giúp đỡ. Do đó, tôi có xu hướng sai lầm khi không vẽ bất kỳ đường trừu tượng nào cho đến khi tôi có một ý tưởng tốt về nơi chúng sẽ hữu ích.

  • Tôi thấy thật khó để biện minh cho việc tăng tính mô đun cho mục đích riêng của mình nếu nó làm cho mã của tôi dài dòng hơn, khó hiểu hơn, v.v. và không loại bỏ bất kỳ sự trùng lặp nào. Tôi thấy mã thủ tục đơn giản, được kết hợp chặt chẽ hoặc mã đối tượng đôi khi dễ hiểu hơn mã ravioli rất được chứng thực bởi vì dòng chảy đơn giản và tuyến tính. Nó cũng dễ viết hơn nhiều.

Mặt khác, suy nghĩ này thường dẫn đến các đối tượng của Thiên Chúa. Tôi thường tái cấu trúc những thứ này một cách bảo thủ, chỉ thêm các dòng trừu tượng rõ ràng khi tôi thấy các mẫu rõ ràng đang nổi lên. Điều gì, nếu có bất cứ điều gì sai với các đối tượng của Chúa và mã được ghép chặt chẽ nếu bạn rõ ràng không cần nhiều mô đun hơn, không có sự trùng lặp đáng kể và mã có thể đọc được?

EDIT: Theo như các nguyên tắc RẮN cá nhân, tôi muốn nhấn mạnh rằng Thay thế Liskov là IMHO một sự chính thức hóa của lẽ thường và nên được áp dụng ở mọi nơi, vì sự trừu tượng không có ý nghĩa nếu nó không có ý nghĩa. Ngoài ra, mỗi lớp nên có một trách nhiệm duy nhất ở một mức độ trừu tượng nào đó, mặc dù nó có thể là một mức rất cao với tất cả các chi tiết triển khai được nhồi nhét vào một lớp 2.000 dòng lớn. Về cơ bản, sự trừu tượng của bạn sẽ có ý nghĩa nơi bạn chọn để trừu tượng. Các nguyên tắc tôi đặt câu hỏi trong trường hợp mô đun hóa không hữu ích rõ ràng là đóng mở, phân biệt giao diện và đặc biệt là đảo ngược phụ thuộc, vì đây là về mô đun hóa, không chỉ có ý nghĩa trừu tượng.


10
@ S.Lott: Từ khóa có "thêm". Đây chính xác là thứ mà YAGNI được phát minh ra. Tăng tính mô-đun hoặc giảm khớp nối đơn giản chỉ vì lợi ích riêng của nó chỉ là lập trình sùng bái hàng hóa.
Mason Wheeler

3
@ S.Lott: Điều đó nên rõ ràng từ bối cảnh. Khi tôi đọc nó, ít nhất, "nhiều hơn hiện tại trong mã đang được đề cập."
Mason Wheeler

3
@ S.Lott: Nếu bạn khăng khăng trở thành người phạm tội, "nhiều hơn" đề cập đến nhiều hơn hiện tại. Hàm ý là một cái gì đó, cho dù mã hoặc thiết kế thô, đã tồn tại và bạn đang suy nghĩ về cách cấu trúc lại nó.
dsimcha

5
@ back2dos: Đúng, nhưng tôi nghi ngờ về kỹ thuật một cái gì đó để mở rộng mà không có ý tưởng rõ ràng về khả năng nó sẽ được mở rộng. Không có thông tin này, các dòng trừu tượng của bạn có thể sẽ kết thúc ở tất cả các vị trí sai. Nếu bạn không biết các dòng trừu tượng có thể hữu ích ở đâu, tôi khuyên bạn chỉ nên viết mã ngắn gọn nhất có thể hoạt động và có thể đọc được, ngay cả khi bạn có một vài đối tượng Chúa ném vào đó.
dsimcha

2
@dsimcha: Bạn thật may mắn nếu các yêu cầu thay đổi sau khi bạn viết một đoạn mã, bởi vì thông thường chúng sẽ thay đổi trong khi bạn làm điều đó. Đây là lý do tại sao việc triển khai ảnh chụp nhanh không phù hợp để tồn tại trong vòng đời phần mềm thực tế. Ngoài ra, RẮN không yêu cầu bạn chỉ trừu tượng một cách mù quáng. Bối cảnh cho một sự trừu tượng được xác định thông qua nghịch đảo phụ thuộc. Bạn giảm sự phụ thuộc của mọi mô-đun xuống mức độ trừu tượng đơn giản và rõ ràng nhất của các dịch vụ khác mà nó dựa vào. Nó không phải là tùy ý, nhân tạo hay phức tạp, nhưng được xác định rõ ràng, hợp lý và đơn giản.
back2dos

Câu trả lời:


8

Sau đây là những nguyên tắc đơn giản bạn có thể áp dụng để giúp bạn hiểu cách cân bằng thiết kế hệ thống của mình:

  • Nguyên tắc trách nhiệm duy nhất: Strong RẮN. Bạn có thể có một đối tượng rất lớn về số lượng phương thức hoặc số lượng dữ liệu và vẫn duy trì nguyên tắc này. Ví dụ như đối tượng Ruby String. Đối tượng này có nhiều phương thức hơn bạn có thể lắc một thanh, nhưng nó vẫn chỉ có một trách nhiệm: giữ một chuỗi văn bản cho ứng dụng. Ngay khi đối tượng của bạn bắt đầu nhận một trách nhiệm mới, hãy bắt đầu suy nghĩ kỹ về điều đó. Vấn đề bảo trì là tự hỏi "tôi sẽ tìm mã này ở đâu nếu tôi gặp vấn đề với nó sau này?"
  • Tính đơn giản: Albert Einstein đã nói "Hãy làm mọi thứ đơn giản nhất có thể, nhưng không đơn giản hơn". Bạn có thực sự cần phương pháp mới đó không? Bạn có thể thực hiện những gì bạn cần với các chức năng hiện có? Nếu bạn thực sự nghĩ rằng cần phải có một phương pháp mới, bạn có thể thay đổi một phương thức hiện có để đáp ứng tất cả những gì bạn cần không? Về bản chất tái cấu trúc khi bạn xây dựng công cụ mới.

Về bản chất, bạn đang cố gắng làm những gì có thể để không tự bắn vào chân mình khi đến lúc phải bảo trì phần mềm. Nếu các đối tượng lớn của bạn là trừu tượng hợp lý, thì có rất ít lý do để phân tách chúng chỉ vì ai đó đã đưa ra một số liệu nói rằng một lớp không nên nhiều hơn X dòng / phương thức / thuộc tính / vv. Nếu bất cứ điều gì, đó là những hướng dẫnquy tắc không khó và nhanh.


3
Nhận xét tốt. Như đã thảo luận trong các câu trả lời khác, một vấn đề với "trách nhiệm duy nhất" là trách nhiệm của một lớp có thể được mô tả ở nhiều mức độ trừu tượng khác nhau.
dsimcha

5

Tôi nghĩ phần lớn bạn đã trả lời câu hỏi của riêng bạn. RẮN là tập hợp các hướng dẫn về cách cấu trúc lại mã của bạn, khi các khái niệm cần được tăng lên mức độ trừu tượng.

Giống như tất cả các ngành học sáng tạo khác, không có sự tuyệt đối - chỉ là sự đánh đổi. Bạn càng làm điều đó thì "càng dễ" quyết định khi nào là đủ cho miền yêu cầu hoặc yêu cầu hiện tại của bạn.

Đã nói rằng - trừu tượng hóa là trái tim của sự phát triển phần mềm - vì vậy nếu không có lý do chính đáng nào để không làm điều đó, thì thực hành sẽ giúp bạn làm tốt hơn và bạn sẽ có cảm giác tốt cho sự đánh đổi. Vì vậy, ủng hộ nó trừ khi nó trở nên bất lợi.


5
I want to avoid premature abstraction.In my experience drawing abstraction lines without concrete use cases... 

Điều này đúng một phần và sai một phần.

Sai
Đây không phải là lý do để ngăn người ta áp dụng các nguyên tắc OO / RẮN. Nó chỉ ngăn chặn việc áp dụng chúng quá sớm.

Đó là ...

Phải
Không tái cấu trúc mã cho đến khi nó có thể tái cấu trúc; khi nó là yêu cầu hoàn thành Hoặc, khi "trường hợp sử dụng" đều ở đó như bạn nói.

I find simple, tightly coupled procedural or God object code is sometimes easier to understand than very well-factored...

Khi làm việc một mình hoặc trong một silo
Vấn đề không làm OO không rõ ràng ngay lập tức. Sau khi bạn viết phiên bản đầu tiên của chương trình:

Code is fresh in your head
Code is familiar
Code is easy to mentally compartmentalize
You wrote it

3/4 những điều tốt đẹp này nhanh chóng chết trong một thời gian ngắn.

Cuối cùng, bạn nhận ra rằng bạn có các đối tượng Thiên Chúa (Đối tượng có nhiều chức năng), vì vậy bạn nhận ra các chức năng riêng lẻ. Đóng gói. Đặt chúng trong các thư mục. Sử dụng giao diện một lần trong một thời gian. Làm cho mình một ưu tiên cho bảo trì dài hạn. Đặc biệt là vì các phương pháp không được tái cấu trúc có xu hướng nở rộ vô tận và trở thành phương pháp của Chúa.

Trong một nhóm
Các vấn đề không làm OO ngay lập tức đáng chú ý. Mã OO tốt ít nhất là phần nào tự viết tài liệu và có thể đọc được. Đặc biệt khi kết hợp với mã xanh tốt. Ngoài ra, việc thiếu cấu trúc khiến việc phân tách các nhiệm vụ và tích hợp trở nên phức tạp hơn nhiều.


Đúng. Tôi mơ hồ nhận ra rằng các đối tượng của tôi làm nhiều hơn một việc, nhưng tôi không nhận ra cụ thể hơn cách phá vỡ chúng một cách hữu ích để các đường trừu tượng sẽ ở đúng nơi khi cần bảo trì. Nó có vẻ như là một sự lãng phí thời gian để tái cấu trúc nếu lập trình viên bảo trì có thể sẽ phải thực hiện tái cấu trúc nhiều hơn nữa để có được các dòng trừu tượng ở đúng vị trí dù sao đi nữa.
dsimcha

Đóng gói và trừu tượng là hai khái niệm khác nhau. Đóng gói là một khái niệm OO cơ bản, về cơ bản có nghĩa là bạn có các lớp. Các lớp học cung cấp tính mô-đun và dễ đọc trong và của chính họ. Điều đó rất hữu ích.
P.Brian.Mackey

Trừu tượng có thể làm giảm bảo trì khi áp dụng đúng cách. Áp dụng không đúng cách nó có thể làm tăng bảo trì. Biết khi nào và ở đâu để vẽ các đường đòi hỏi một sự hiểu biết vững chắc về doanh nghiệp, khuôn khổ, khách hàng bên cạnh các khía cạnh kỹ thuật cơ bản của cách "áp dụng một mô hình nhà máy" mỗi se.
P.Brian.Mackey

3

Không có gì sai với các đối tượng lớn và mã được ghép chặt chẽ khi chúng phù hợp và khi không có gì được thiết kế tốt hơn . Đây chỉ là một biểu hiện khác của một quy tắc ngón tay cái biến thành giáo điều.

Khớp nối lỏng lẻo và các vật thể nhỏ, đơn giản có xu hướng mang lại lợi ích cụ thể trong nhiều trường hợp phổ biến, do đó, nói chung nên sử dụng chúng. Vấn đề nằm ở những người không hiểu lý do căn bản đằng sau những nguyên tắc mù quáng cố gắng áp dụng chúng một cách phổ biến, ngay cả khi họ không áp dụng.


1
+1. Vẫn cần một định nghĩa tốt về "thích hợp" nghĩa là gì.
jprete

2
@jprete: Tại sao? Cố gắng áp dụng các định nghĩa tuyệt đối là một phần nguyên nhân của sự lộn xộn khái niệm như thế này. Có rất nhiều nghề thủ công liên quan đến việc xây dựng phần mềm tốt. IMO thực sự cần thiết là kinh nghiệm và phán đoán tốt.
Mason Wheeler

4
Vâng, có, nhưng một định nghĩa rộng của một số loại vẫn còn hữu ích.
jprete

1
Có một định nghĩa phù hợp sẽ hữu ích, nhưng đó là điểm chính. Thật khó để xác định một vết cắn âm thanh bởi vì nó chỉ áp dụng cho từng trường hợp. Cho dù bạn đưa ra lựa chọn phù hợp cho từng trường hợp phần lớn là để trải nghiệm. Nếu bạn không thể nói rõ lý do tại sao bạn là sự gắn kết cao của bạn, giải pháp nguyên khối tốt hơn là một giải pháp gắn kết thấp, mô-đun cao, bạn có thể "tốt hơn" nên sử dụng sự gắn kết thấp và mô đun. Luôn luôn dễ dàng hơn để tái cấu trúc.
Ian

1
Tôi thích ai đó viết mã tách rời một cách mù quáng thay vì viết mã spaghetti một cách mù quáng :)
Boris Yankov

2

Tôi có xu hướng tiếp cận điều này nhiều hơn từ quan điểm của You Ain't Gonna Need It. Bài đăng này sẽ tập trung vào một mục cụ thể: kế thừa.

Trong thiết kế ban đầu của tôi, tôi tạo ra một hệ thống phân cấp những thứ tôi biết sẽ có hai hoặc nhiều hơn. Rất có thể họ sẽ cần nhiều mã giống nhau, vì vậy, đáng để thiết kế nó ngay từ đầu. Sau khi mã ban đầu được đặt ra và tôi cần thêm nhiều tính năng / chức năng, tôi nhìn vào những gì tôi có và nghĩ, "Có phải cái gì đó tôi đã thực hiện cùng chức năng hoặc tương tự không?" Nếu vậy, đó rất có thể là một sự trừu tượng mới đang cầu xin được phát hành.

Một ví dụ điển hình của việc này là một khung MVC. Bắt đầu từ đầu, bạn tạo một trang lớn với mã phía sau. Nhưng sau đó bạn muốn thêm một trang khác. Tuy nhiên, một mã phía sau đã triển khai rất nhiều logic mà trang mới yêu cầu. Vì vậy, bạn trừu tượng hóa một Controllerlớp / giao diện sẽ triển khai logic cụ thể cho trang đó, để lại những thứ phổ biến trong mã "thần" ban đầu.


1

Nếu BẠN biết là nhà phát triển khi nào KHÔNG áp dụng các nguyên tắc vì tương lai của mã, thì tốt cho bạn.

Tôi hy vọng RẮN vẫn ở trong tâm trí bạn để biết khi nào mọi thứ cần được trừu tượng hóa để tránh sự phức tạp và cải thiện chất lượng của mã nếu nó bắt đầu giảm giá trị mà bạn đã nêu.

Quan trọng hơn, hãy xem xét rằng phần lớn các nhà phát triển đang làm công việc hàng ngày và không quan tâm nhiều như bạn. Nếu ban đầu bạn đặt ra các phương thức chạy dài, các nhà phát triển khác đi vào mã sẽ nghĩ gì khi họ duy trì hoặc mở rộng nó? ... Vâng, bạn đã đoán, các hàm BIGGER, các lớp chạy lâu hơn và THÊM các đối tượng thần, và họ không có các nguyên tắc trong tâm trí để có thể bắt được mã đang phát triển và gói gọn nó một cách chính xác. Mã "có thể đọc được" của bạn giờ trở thành một mớ hỗn độn.

Vì vậy, bạn có thể lập luận rằng một nhà phát triển tồi sẽ làm điều đó bất kể, nhưng ít nhất bạn có lợi thế tốt hơn nếu mọi thứ được giữ đơn giản và được tổ chức tốt ngay từ đầu.

Tôi không đặc biệt quan tâm đến "Bản đồ đăng ký" toàn cầu hoặc "Đối tượng của Chúa" nếu chúng đơn giản. Nó thực sự phụ thuộc vào thiết kế hệ thống, đôi khi bạn có thể thoát khỏi nó và vẫn đơn giản, đôi khi bạn không thể.

Chúng ta cũng đừng quên rằng các chức năng lớn và các Đối tượng Thần có thể chứng minh cực kỳ khó kiểm tra. Nếu bạn muốn duy trì Agile và cảm thấy "An toàn" khi bao thanh toán lại và thay đổi mã, bạn cần thử nghiệm. Các bài kiểm tra rất khó để viết khi các chức năng hoặc đối tượng làm nhiều việc.


1
Về cơ bản là một câu trả lời tốt. Tôi có một điểm yếu là, nếu một số nhà phát triển bảo trì xuất hiện và gây ra sự lộn xộn, đó là lỗi của anh ta / cô ta vì đã không tái cấu trúc, trừ khi những thay đổi đó dường như đủ tầm nhìn để lập kế hoạch cho họ hoặc mã được ghi chép / kiểm tra / v.v. . tái cấu trúc đó sẽ là một hình thức điên rồ.
dsimcha

Đó là dsimcha đúng. Chỉ là tôi nghĩ trong một hệ thống mà nhà phát triển tạo thư mục "RequestHandlers" và mỗi lớp trong thư mục đó là một trình xử lý yêu cầu, sau đó nhà phát triển tiếp theo xuất hiện và nghĩ: "Tôi cần đưa vào trình xử lý yêu cầu mới", cơ sở hạ tầng hiện tại gần như buộc anh ta xuống tuyến đường để tuân theo quy ước. Tôi nghĩ rằng đây là những gì tôi đã cố gắng nói. Thiết lập một quy ước rõ ràng ngay từ đầu, có thể hướng dẫn ngay cả những nhà phát triển thiếu kinh nghiệm nhất để tiếp tục mô hình.
Martin Blore

1

Vấn đề với một đối tượng thần là bạn thường có thể phá vỡ nó thành nhiều mảnh. Theo định nghĩa, nó làm nhiều hơn một điều. Toàn bộ mục đích của việc chia nó thành các lớp nhỏ hơn là để bạn có thể có một lớp thực hiện tốt một việc (và bạn cũng không nên kéo dài định nghĩa về "một điều"). Điều này có nghĩa là, đối với bất kỳ lớp cụ thể nào, một khi bạn biết một điều cần phải làm, bạn sẽ có thể đọc nó một cách khá dễ dàng và nói liệu nó có làm đúng một điều hay không.

Tôi nghĩ rằng có một điều như vậy là có quá nhiều mô đun, và quá nhiều sự linh hoạt, nhưng mà của nhiều hơn một vấn đề trong thiết kế và quá kỹ thuật, nơi bạn đang kế toán cho các yêu cầu mà bạn thậm chí không biết khách hàng muốn. Rất nhiều ý tưởng thiết kế được định hướng xung quanh giúp dễ dàng kiểm soát các thay đổi về cách mã được chạy, nhưng nếu không ai mong đợi sự thay đổi, thì việc bao gồm tính linh hoạt là vô nghĩa.


"Có nhiều hơn một thứ" có thể khó xác định, tùy thuộc vào mức độ trừu tượng mà bạn đang làm việc. Có thể lập luận rằng bất kỳ phương thức nào có hai hoặc nhiều dòng mã đều làm nhiều hơn một việc. Ở phía đối diện của quang phổ, một thứ phức tạp như một công cụ viết kịch bản sẽ cần rất nhiều phương thức mà tất cả đều thực hiện các "việc" riêng lẻ không liên quan trực tiếp với nhau, nhưng mỗi phần bao gồm một phần quan trọng của "meta- điều "làm cho các kịch bản của bạn chạy đúng, và chỉ có rất nhiều phá vỡ có thể được thực hiện mà không phá vỡ công cụ kịch bản.
Mason Wheeler

Chắc chắn có một phổ các cấp độ khái niệm, nhưng chúng ta có thể chọn một điểm trên đó: kích thước của một "lớp làm một việc" phải như vậy mà bạn gần như có thể hiểu ngay việc thực hiện. Tức là các chi tiết thực hiện phù hợp trong đầu của bạn. Nếu nó trở nên lớn hơn, thì bạn không thể hiểu cả lớp cùng một lúc. Nếu nó nhỏ hơn, thì bạn đang trừu tượng hóa quá xa. Nhưng như bạn đã nói trong một bình luận khác, có rất nhiều đánh giá và kinh nghiệm liên quan.
jprete

IMHO mức độ trừu tượng tốt nhất để suy nghĩ là mức độ mà bạn mong đợi người tiêu dùng của đối tượng sẽ sử dụng. Giả sử bạn có một đối tượng được gọi là Queryertối ưu hóa các truy vấn cơ sở dữ liệu, truy vấn RDBMS và phân tích kết quả thành các đối tượng để trả về. Nếu chỉ có một cách để làm điều này trong ứng dụng của bạn và Queryerđược niêm phong kín và gói gọn theo cách này, thì nó chỉ làm một việc. Nếu có nhiều cách để làm điều này và ai đó có thể quan tâm đến các chi tiết của một phần của nó, thì nó sẽ làm nhiều việc và bạn có thể muốn tách nó ra.
dsimcha

1

Tôi sử dụng một hướng dẫn đơn giản hơn: nếu bạn có thể viết các bài kiểm tra đơn vị cho nó và không có sự sao chép mã, nó đủ trừu tượng. Thêm vào đó, bạn đang ở một vị trí tốt để tái cấu trúc sau này.

Ngoài ra, bạn nên ghi nhớ RẮN, nhưng là một hướng dẫn hơn là một quy tắc.


0

Điều gì, nếu có bất cứ điều gì sai với các đối tượng của Chúa và mã được ghép chặt chẽ nếu bạn rõ ràng không cần nhiều mô đun hơn, không có sự trùng lặp đáng kể và mã có thể đọc được?

Nếu ứng dụng đủ nhỏ, mọi thứ đều có thể duy trì. Trong các ứng dụng lớn hơn, các đối tượng của Chúa nhanh chóng trở thành một vấn đề. Cuối cùng thực hiện một tính năng mới đòi hỏi phải sửa đổi 17 đối tượng Chúa. Mọi người không làm rất tốt theo các thủ tục 17 bước. Các đối tượng Thần liên tục được sửa đổi bởi nhiều nhà phát triển và những thay đổi đó phải được hợp nhất nhiều lần. Bạn không muốn đến đó.


0

Tôi chia sẻ mối quan tâm của bạn về sự trừu tượng quá mức và không phù hợp, nhưng tôi không nhất thiết phải quá quan tâm đến sự trừu tượng quá sớm.

Điều đó có vẻ như mâu thuẫn, nhưng sử dụng một sự trừu tượng không có khả năng gây ra vấn đề miễn là bạn không quá quan tâm đến nó quá sớm - tức là miễn là bạn sẵn sàng và có thể tái cấu trúc nếu cần thiết.

Điều này ngụ ý là một số mức độ tạo mẫu, thử nghiệm và quay lui trong mã.

Điều đó nói rằng, không có quy tắc xác định đơn giản để tuân theo sẽ giải quyết tất cả các vấn đề. Kinh nghiệm được tính rất nhiều, nhưng bạn phải có được kinh nghiệm đó bằng cách phạm sai lầm. Và luôn có nhiều sai lầm hơn để làm cho những sai lầm trước đó sẽ không giúp bạn chuẩn bị.

Mặc dù vậy, hãy coi các nguyên tắc trong sách giáo khoa là điểm khởi đầu, sau đó học lập trình rất nhiều và xem các nguyên tắc đó hoạt động như thế nào. Nếu có thể đưa ra những hướng dẫn tốt hơn, chính xác và đáng tin cậy hơn những điều như RẮN, thì có lẽ ai đó đã làm như vậy ngay bây giờ - và ngay cả khi họ có, những nguyên tắc cải tiến đó vẫn sẽ không hoàn hảo, và mọi người sẽ hỏi về những hạn chế trong những điều đó .

Cũng rất tốt - nếu bất cứ ai cũng có thể cung cấp một thuật toán xác định, rõ ràng để thiết kế và mã hóa chương trình, thì chỉ có một chương trình cuối cùng để con người viết - chương trình sẽ tự động viết tất cả các chương trình trong tương lai mà không cần sự can thiệp của con người.


0

Vẽ các đường trừu tượng thích hợp là điều mà người ta rút ra từ kinh nghiệm. Bạn sẽ phạm sai lầm khi làm điều đó là không thể phủ nhận.

RẮN là một hình thức tập trung của trải nghiệm đó được trao cho bạn bởi những người có được trải nghiệm này một cách khó khăn. Bạn đã đóng đinh nó rất nhiều khi bạn nói rằng bạn sẽ không tạo ra sự trừu tượng trước khi bạn thấy cần nó. Vâng, kinh nghiệm RẮN cung cấp cho bạn sẽ giúp bạn giải quyết các vấn đề mà bạn chưa từng tồn tại . Nhưng hãy tin tôi ... có rất thật.

RẮN là về tính mô đun, tính mô đun là về khả năng bảo trì và khả năng bảo trì là cho phép bạn giữ một lịch trình làm việc nhân đạo một khi phần mềm đạt đến sản xuất và khách hàng bắt đầu nhận thấy các lỗi mà bạn không mắc phải.

Lợi ích lớn nhất của tính mô đun là khả năng kiểm tra. Hệ thống của bạn càng nhiều mô-đun thì càng dễ kiểm tra và bạn có thể xây dựng nền tảng vững chắc nhanh hơn để giải quyết các khía cạnh khó khăn hơn của vấn đề. Vì vậy, vấn đề của bạn có thể không đòi hỏi tính mô đun này, nhưng thực tế nó sẽ cho phép bạn tạo mã kiểm tra tốt hơn nhanh hơn là không có gì phải cố gắng để mô đun hóa.

Nhanh nhẹn là tất cả về nỗ lực để đạt được sự cân bằng tinh tế giữa vận chuyển nhanh và cung cấp chất lượng tốt. Agile không có nghĩa là chúng ta nên cắt giảm, trên thực tế, các dự án nhanh nhẹn thành công nhất mà tôi đã tham gia là những dự án rất chú ý đến các hướng dẫn như vậy.


0

Một điểm quan trọng dường như đã bị bỏ qua là RẮN được thực hành cùng với TDD. TDD có xu hướng làm nổi bật những gì "phù hợp" trong bối cảnh cụ thể của bạn và giúp giảm bớt rất nhiều sự tương đồng có vẻ như trong lời khuyên.


1
Hãy xem xét mở rộng theo câu trả lời của bạn. Vì thế, bạn đang tập hợp hai khái niệm trực giao và không rõ kết quả giải quyết mối quan tâm của OP như thế nào.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.