Làm thế nào để tôi tránh tái cấu trúc tầng?


52

Tôi đã có một dự án. Trong dự án này, tôi muốn cấu trúc lại nó để thêm một tính năng và tôi đã cấu trúc lại dự án để thêm tính năng này.

Vấn đề là khi tôi đã hoàn thành, hóa ra tôi cần phải thực hiện một thay đổi giao diện nhỏ để phù hợp với nó. Vì vậy, tôi đã thực hiện thay đổi. Và sau đó, lớp tiêu thụ không thể được thực hiện với giao diện hiện tại về mặt giao diện mới, vì vậy nó cũng cần một giao diện mới. Bây giờ là ba tháng sau, và tôi đã phải khắc phục vô số vấn đề hầu như không liên quan và tôi đang xem xét giải quyết các vấn đề đã được đưa ra trong một năm kể từ bây giờ hoặc đơn giản được liệt kê là sẽ không khắc phục do khó khăn trước khi mọi thứ sẽ được biên dịch lần nữa.

Làm thế nào tôi có thể tránh loại tái cấu trúc xếp tầng này trong tương lai? Có phải nó chỉ là một triệu chứng của các lớp trước của tôi phụ thuộc quá chặt chẽ vào nhau?

Chỉnh sửa ngắn gọn: Trong trường hợp này, bộ tái cấu trúc tính năng, vì bộ tái cấu trúc đã tăng khả năng mở rộng của một đoạn mã cụ thể và giảm một số khớp nối. Điều này có nghĩa là các nhà phát triển bên ngoài có thể làm nhiều hơn, đó là tính năng tôi muốn cung cấp. Vì vậy, bộ tái cấu trúc ban đầu không nên là một thay đổi chức năng.

Chỉnh sửa lớn hơn mà tôi đã hứa năm ngày trước:

Trước khi tôi bắt đầu công cụ tái cấu trúc này, tôi đã có một hệ thống nơi tôi có giao diện, nhưng trong quá trình thực hiện, tôi chỉ đơn giản dynamic_castthông qua tất cả các triển khai có thể mà tôi đã vận chuyển. Điều này rõ ràng có nghĩa là bạn không thể thừa hưởng từ giao diện, vì một điều, và thứ hai, rằng bất kỳ ai cũng không thể truy cập để thực hiện giao diện này. Vì vậy, tôi quyết định rằng tôi muốn khắc phục vấn đề này và mở giao diện cho tiêu dùng công cộng để bất kỳ ai cũng có thể thực hiện và việc thực hiện giao diện là toàn bộ hợp đồng cần thiết - rõ ràng là một sự cải tiến.

Khi tôi đang tìm và giết bằng lửa tất cả những nơi mà tôi đã làm điều này, tôi đã tìm thấy một nơi được chứng minh là một vấn đề đặc biệt. Nó phụ thuộc vào chi tiết triển khai của tất cả các lớp phái sinh khác nhau và chức năng trùng lặp đã được triển khai nhưng tốt hơn ở một nơi khác. Nó có thể đã được thực hiện theo giao diện công cộng thay vào đó và sử dụng lại việc triển khai chức năng đó. Tôi phát hiện ra rằng nó đòi hỏi một phần bối cảnh cụ thể để hoạt động chính xác. Nói một cách đơn giản, việc thực hiện cuộc gọi trước đó trông giống như

for(auto&& a : as) {
     f(a);
}

Tuy nhiên, để có được bối cảnh này, tôi cần phải thay đổi nó thành một cái gì đó giống như

std::vector<Context> contexts;
for(auto&& a : as)
    contexts.push_back(g(a));
do_thing_now_we_have_contexts();
for(auto&& con : contexts)
    f(con);

Điều này có nghĩa là đối với tất cả các hoạt động từng là một phần của f, một số trong số chúng cần phải được thực hiện một phần của chức năng mới ghoạt động mà không có ngữ cảnh và một số trong số chúng cần phải được thực hiện trong một phần của phần bị trì hoãn f. Nhưng không phải tất cả các phương thức đều fcần hoặc muốn bối cảnh này - một số trong chúng cần một bối cảnh riêng biệt mà chúng có được thông qua các phương tiện riêng biệt. Vì vậy, đối với tất cả mọi thứ fkết thúc cuộc gọi (nghĩa là, đại khái là khá nhiều thứ ), tôi phải xác định xem, nếu có, bối cảnh họ cần, họ nên lấy nó từ đâu và làm thế nào để tách chúng từ cũ fthành mới fvà mới g.

Và đó là cách tôi kết thúc nơi tôi đang ở. Lý do duy nhất mà tôi tiếp tục là vì tôi cần tái cấu trúc này vì những lý do khác.


67
Khi bạn nói bạn "tái cấu trúc dự án để thêm một tính năng", ý bạn chính xác là gì? Tái cấu trúc không thay đổi hành vi của các chương trình, theo định nghĩa, làm cho tuyên bố này khó hiểu.
Jules

5
@Jules: Nói đúng ra, tính năng này là cho phép các nhà phát triển khác thêm một loại tiện ích mở rộng cụ thể, vì vậy tính năng này là bộ tái cấu trúc, làm cho cấu trúc lớp mở hơn.
DeadMG

5
Tôi nghĩ rằng điều này được thảo luận trong mỗi cuốn sách và bài báo nói về tái cấu trúc? Kiểm soát nguồn đến cứu hộ; nếu bạn thấy rằng để làm bước A, bạn phải làm bước B trước, sau đó loại bỏ A và làm B trước.
rwong

4
@DeadMG: đây là cuốn sách ban đầu tôi muốn trích dẫn trong bình luận đầu tiên của mình: "Trò chơi" gậy gắp "là một phép ẩn dụ tốt cho Phương pháp Mikado. Bạn loại bỏ" nợ kỹ thuật "các vấn đề di sản được nhúng trong gần như mọi phần mềm Hệ thống bằng cách tuân theo một bộ quy tắc dễ thực hiện. Bạn cẩn thận trích xuất từng phụ thuộc đan xen cho đến khi bạn phơi bày vấn đề trung tâm, mà không làm sập dự án. "
rwong

2
Có thể, bạn có thể làm rõ ngôn ngữ lập trình mà chúng ta đang nói về? Sau khi đọc tất cả các bình luận của bạn, tôi đi đến kết luận rằng bạn đang làm bằng tay thay vì sử dụng IDE để hỗ trợ bạn. Vì vậy, tôi muốn biết, liệu tôi có thể cho bạn một số lời khuyên thiết thực.
đóng gói

Câu trả lời:


69

Lần trước tôi đã cố gắng bắt đầu tái cấu trúc với những hậu quả không lường trước được và tôi không thể ổn định việc xây dựng và / hoặc các thử nghiệm sau một ngày , tôi đã từ bỏ và hoàn nguyên codebase về điểm trước khi tái cấu trúc.

Sau đó, tôi bắt đầu phân tích những gì đã sai và phát triển một kế hoạch tốt hơn để thực hiện tái cấu trúc theo các bước nhỏ hơn. Vì vậy, lời khuyên của tôi để tránh tái cấu trúc xếp tầng chỉ là: biết khi nào nên dừng lại , đừng để mọi thứ vượt khỏi tầm kiểm soát của bạn!

Đôi khi bạn phải cắn viên đạn và vứt bỏ cả ngày làm việc - chắc chắn dễ dàng hơn là vứt bỏ ba tháng làm việc. Ngày bạn buông thả không hoàn toàn vô ích, ít nhất bạn đã học được cách không tiếp cận vấn đề. Và theo kinh nghiệm của tôi, luôn có khả năng thực hiện các bước nhỏ hơn trong tái cấu trúc.

Lưu ý bên lề : bạn dường như rơi vào tình huống phải quyết định xem bạn có sẵn sàng hy sinh trọn vẹn ba tháng làm việc và bắt đầu lại với kế hoạch tái cấu trúc mới (và hy vọng sẽ thành công hơn). Tôi có thể tưởng tượng rằng đó không phải là một quyết định dễ dàng, nhưng hãy tự hỏi, nguy cơ bạn cần thêm ba tháng nữa không chỉ để ổn định công trình, mà còn sửa tất cả các lỗi không lường trước mà bạn có thể đã giới thiệu trong khi viết lại trong ba tháng qua ? Tôi đã viết "viết lại", bởi vì tôi đoán đó là những gì bạn thực sự đã làm, không phải là "tái cấu trúc". Không có khả năng là bạn có thể giải quyết vấn đề hiện tại của mình nhanh hơn bằng cách quay lại bản sửa đổi cuối cùng nơi dự án của bạn biên dịch và bắt đầu với một phép tái cấu trúc thực sự (trái ngược với "viết lại") một lần nữa.


53

Có phải nó chỉ là một triệu chứng của các lớp trước của tôi phụ thuộc quá chặt chẽ vào nhau?

Chắc chắn rồi. Một thay đổi gây ra vô số thay đổi khác là định nghĩa của khớp nối.

Làm thế nào để tôi tránh các nhà tái cấu trúc tầng?

Trong loại tiền mã hóa tồi tệ nhất, một thay đổi duy nhất sẽ tiếp tục xếp tầng, cuối cùng khiến bạn thay đổi (gần như) mọi thứ. Một phần của bất kỳ bộ tái cấu trúc nào có khớp nối rộng là để cách ly phần bạn đang làm việc. Bạn cần cấu trúc lại không chỉ nơi tính năng mới của bạn chạm vào mã này, mà là nơi mọi thứ khác chạm vào mã đó.

Thông thường điều đó có nghĩa là làm cho một số bộ điều hợp để giúp mã cũ hoạt động với một cái gì đó trông và hoạt động giống như mã cũ, nhưng sử dụng giao diện / triển khai mới. Rốt cuộc, nếu tất cả những gì bạn làm là thay đổi giao diện / cách thực hiện nhưng để lại khớp nối thì bạn không thu được gì. Đó là son môi trên một con lợn.


33
+1 Việc tái cấu trúc càng tệ thì càng cần phải tái cấu trúc càng rộng. Đó là bản chất của sự việc.
Paul Draper

4
Tuy nhiên, nếu bạn thực sự tái cấu trúc , các mã khác không cần phải quan tâm đến những thay đổi ngay lập tức. (Tất nhiên cuối cùng bạn sẽ muốn dọn sạch các phần khác ... nhưng điều đó không cần thiết ngay lập tức.) Một thay đổi "xếp tầng" qua phần còn lại của ứng dụng, lớn hơn so với tái cấu trúc - tại thời điểm đó, nó về cơ bản là thiết kế lại hoặc viết lại.
cHao

+1 Bộ điều hợp chính xác là cách cô lập mã bạn muốn thay đổi trước tiên.
nháy mắt

17

Có vẻ như tái cấu trúc của bạn là quá tham vọng. Việc tái cấu trúc nên được áp dụng theo các bước nhỏ, mỗi bước có thể được hoàn thành trong (giả sử) trong 30 phút - hoặc, trong trường hợp xấu nhất, nhiều nhất là một ngày - và để dự án có thể xây dựng và tất cả các thử nghiệm vẫn trôi qua.

Nếu bạn giữ cho mỗi thay đổi tối thiểu, thì việc tái cấu trúc sẽ phá vỡ công trình của bạn trong một thời gian dài. Trường hợp xấu nhất có lẽ là thay đổi các tham số thành một phương thức trong giao diện được sử dụng rộng rãi, ví dụ để thêm một tham số mới. Nhưng những thay đổi hệ quả từ điều này là cơ học: thêm (và bỏ qua) tham số trong mỗi lần thực hiện và thêm một giá trị mặc định trong mỗi cuộc gọi. Ngay cả khi có hàng trăm tài liệu tham khảo, thì cũng không cần đến một ngày để thực hiện tái cấu trúc như vậy.


4
Tôi không thấy làm thế nào một tình huống như vậy có thể phát sinh. Đối với bất kỳ cấu trúc lại hợp lý nào của giao diện của phương thức, phải có một bộ tham số mới được xác định dễ dàng có thể được chuyển qua, điều này sẽ dẫn đến hành vi của cuộc gọi giống như trước khi thay đổi.
Jules

3
Tôi chưa bao giờ ở trong một tình huống mà tôi muốn thực hiện tái cấu trúc như vậy, nhưng tôi phải nói rằng nó nghe có vẻ khá bất thường đối với tôi. Bạn đang nói rằng bạn đã loại bỏ chức năng khỏi giao diện? Nếu vậy, nó đã đi đâu? Vào giao diện khác? Hay ở đâu đó khác?
Jules

5
Sau đó, cách để làm là loại bỏ tất cả các công dụng của tính năng cần xóa trước khi tái cấu trúc để loại bỏ nó, thay vì sau đó. Điều này cho phép bạn giữ việc xây dựng mã trong khi bạn đang làm việc với nó.
Jules

11
@DeadMG: nghe có vẻ lạ: bạn đang xóa một tính năng không còn cần thiết nữa, như bạn nói. Nhưng mặt khác, bạn viết "dự án trở nên hoàn toàn không hoạt động" - điều đó thực sự có vẻ như tính năng này là hoàn toàn cần thiết. Vui lòng làm rõ.
Doc Brown

26
@DeadMG Trong những trường hợp như vậy, bạn thường sẽ phát triển tính năng mới, thêm các kiểm tra để đảm bảo nó hoạt động, chuyển mã hiện có để sử dụng giao diện mới và sau đó loại bỏ tính năng cũ (hiện tại). Theo cách đó, không nên có một điểm mà mọi thứ bị phá vỡ.
sapi

12

Làm thế nào tôi có thể tránh loại tái cấu trúc xếp tầng này trong tương lai?

Thiết kế tư duy mơ ước

Mục tiêu là thiết kế và triển khai OO tuyệt vời cho tính năng mới. Tránh tái cấu trúc cũng là một mục tiêu.

Bắt đầu từ đầu và thiết kế cho tính năng mới , đó là những gì bạn muốn bạn có. Hãy dành thời gian để làm điều đó tốt.

Tuy nhiên, lưu ý rằng chìa khóa ở đây là "thêm một tính năng". Các công cụ mới có xu hướng cho phép chúng ta bỏ qua phần lớn cấu trúc hiện tại của cơ sở mã. Thiết kế mơ tưởng của chúng tôi là độc lập. Nhưng sau đó chúng ta cần thêm hai điều:

  • Bộ tái cấu trúc chỉ đủ để tạo một đường nối cần thiết để tiêm / triển khai mã của tính năng mới.
    • Khả năng tái cấu trúc không nên lái thiết kế mới.
  • Viết một lớp khách phải đối mặt với một API giữ cho tính năng mới và codez hiện tại không biết gì về nhau.
    • Nó phiên âm để lấy các đối tượng, dữ liệu và kết quả qua lại. Nguyên tắc kiến ​​thức tối thiểu bị nguyền rủa. Chúng tôi sẽ không làm bất cứ điều gì tồi tệ hơn những gì mã hiện có đã làm.

Heuristic, bài học kinh nghiệm, vv

Tái cấu trúc đơn giản như việc thêm một tham số mặc định vào một cuộc gọi phương thức hiện có; hoặc một cuộc gọi đến một phương thức lớp tĩnh.

Các phương thức mở rộng trên các lớp hiện có có thể giúp giữ chất lượng của thiết kế mới với rủi ro tối thiểu tuyệt đối.

"Cấu trúc" là tất cả mọi thứ. Cấu trúc là việc thực hiện Nguyên tắc Trách nhiệm duy nhất; thiết kế tạo điều kiện cho chức năng. Mã sẽ duy trì ngắn gọn và đơn giản trong suốt quá trình phân cấp lớp. Thời gian cho thiết kế mới được tạo ra trong quá trình thử nghiệm, làm việc lại và tránh bị hack thông qua rừng mã di sản.

Lớp học suy nghĩ mong muốn tập trung vào nhiệm vụ trong tầm tay. Nói chung, hãy quên việc mở rộng một lớp hiện có - bạn chỉ cần tạo ra tầng tái cấu trúc một lần nữa và phải đối phó với chi phí "hạng nặng" hơn.

Dọn sạch mọi tàn dư của chức năng mới này khỏi mã hiện có. Ở đây, chức năng tính năng mới đầy đủ và được đóng gói tốt quan trọng hơn là tránh tái cấu trúc.


9

Từ (cuốn sách tuyệt vời) Làm việc hiệu quả với Bộ luật kế thừa của Michael Feathers :

Khi bạn phá vỡ sự phụ thuộc trong mã kế thừa, bạn thường phải tạm dừng cảm giác thẩm mỹ của mình một chút. Một số phụ thuộc phá vỡ sạch sẽ; những người khác cuối cùng tìm kiếm ít hơn lý tưởng từ quan điểm thiết kế. Chúng giống như các điểm rạch trong phẫu thuật: có thể có một vết sẹo trong mã của bạn sau khi làm việc, nhưng mọi thứ bên dưới nó có thể trở nên tốt hơn.

Nếu sau này bạn có thể bao gồm mã xung quanh điểm mà bạn đã phá vỡ các phụ thuộc, bạn cũng có thể chữa lành vết sẹo đó.


6

Nghe có vẻ như (đặc biệt là từ các cuộc thảo luận trong các bình luận) bạn đã tự đóng hộp với các quy tắc tự áp đặt có nghĩa là thay đổi "nhỏ" này là cùng một lượng công việc như viết lại hoàn toàn phần mềm.

Giải pháp phải là "đừng làm vậy" . Đây là những gì xảy ra trong các dự án thực tế. Kết quả là có rất nhiều API cũ có giao diện xấu hoặc các tham số bị bỏ qua (luôn là null) hoặc các hàm có tên Do ThisT Breath2 () giống như Do ThisThing () với danh sách tham số hoàn toàn khác. Các thủ thuật phổ biến khác bao gồm dập thông tin trong toàn cầu hoặc các con trỏ được gắn thẻ để đưa thông tin qua một khung lớn. (Ví dụ: tôi có một dự án trong đó một nửa bộ đệm âm thanh chỉ chứa giá trị ma thuật 4 byte vì điều đó dễ hơn nhiều so với việc thay đổi cách thư viện gọi codec âm thanh của nó.)

Thật khó để đưa ra lời khuyên cụ thể mà không có mã cụ thể.


3

Kiểm tra tự động. Bạn không cần phải là một người nhiệt tình TDD, bạn cũng không cần bảo hiểm 100%, nhưng các bài kiểm tra tự động là những gì cho phép bạn thực hiện các thay đổi một cách tự tin. Ngoài ra, có vẻ như bạn có một thiết kế với khớp nối rất cao; bạn nên đọc về các nguyên tắc RẮN, được xây dựng cụ thể để giải quyết loại vấn đề này trong thiết kế phần mềm.

Tôi cũng muốn giới thiệu những cuốn sách này.

  • Làm việc hiệu quả với Mã di sản , Lông vũ
  • Tái cấu trúc , Fowler
  • Phát triển phần mềm hướng đối tượng, được hướng dẫn bởi các thử nghiệm , Freeman và Pryce
  • Mã sạch , Martin

3
Câu hỏi của bạn là "làm thế nào để tôi tránh [thất bại] này trong tương lai?" Câu trả lời là, ngay cả khi bạn hiện đang "có" CI và xét nghiệm, bạn vẫn không áp dụng chúng một cách chính xác. Tôi đã không có một lỗi biên dịch kéo dài hơn mười phút trong nhiều năm, bởi vì tôi xem việc biên dịch là "thử nghiệm đơn vị đầu tiên" và khi nó bị hỏng, tôi đã sửa nó, bởi vì tôi cần phải xem các thử nghiệm vượt qua Tôi đang làm việc thêm về mã.
asthasr

6
Nếu tôi đang cấu trúc lại một giao diện được sử dụng nhiều, tôi sẽ thêm một shim. Shim này xử lý mặc định, để các cuộc gọi di sản tiếp tục hoạt động. Tôi làm việc trên giao diện đằng sau shim, sau đó, khi tôi hoàn thành nó, tôi bắt đầu thay đổi các lớp để sử dụng lại giao diện thay vì shim.
asthasr

5
Tiếp tục tái cấu trúc mặc dù xây dựng thất bại cũng giống như tính toán chết . Đó là một kỹ thuật điều hướng của phương sách cuối cùng . Khi tái cấu trúc, có thể hướng tái cấu trúc hoàn toàn sai và bạn đã thấy dấu hiệu nhận biết về điều đó (thời điểm nó dừng biên dịch, tức là bay mà không có chỉ số tốc độ bay), nhưng bạn đã quyết định nhấn vào. Cuối cùng máy bay rơi ra khỏi radar. May mắn thay, chúng tôi không cần hộp đen hoặc các nhà điều tra để tái cấu trúc: chúng tôi luôn có thể "khôi phục lại trạng thái tốt đã biết trước".
rwong

4
@DeadMG: bạn đã viết "Trong trường hợp của tôi, các cuộc gọi trước đơn giản là không còn ý nghĩa nữa", nhưng trong câu hỏi của bạn "một thay đổi giao diện nhỏ để phù hợp với nó". Thành thật mà nói, chỉ một trong hai câu đó có thể đúng. Và từ mô tả vấn đề của bạn, có vẻ như khá rõ ràng rằng thay đổi giao diện của bạn chắc chắn không phải là vấn đề nhỏ . Bạn nên thực sự, thực sự suy nghĩ nhiều hơn về cách làm cho thay đổi của bạn tương thích ngược hơn. Theo kinh nghiệm của tôi, điều đó luôn luôn có thể, nhưng trước tiên bạn phải đưa ra một kế hoạch tốt.
Doc Brown

3
@DeadMG Trong trường hợp đó, tôi nghĩ những gì bạn đang làm không thể được gọi là tái cấu trúc một cách hợp lý, điểm cơ bản là áp dụng thay đổi thiết kế như một loạt các bước rất đơn giản.
Jules

3

Có phải nó chỉ là một triệu chứng của các lớp trước của tôi phụ thuộc quá chặt chẽ vào nhau?

Hầu hết có lẽ là có. Mặc dù bạn có thể nhận được các hiệu ứng tương tự với cơ sở mã khá đẹp và sạch khi các yêu cầu thay đổi đủ

Làm thế nào tôi có thể tránh loại tái cấu trúc xếp tầng này trong tương lai?

Ngoài việc dừng lại để làm việc với mã kế thừa, bạn không thể sợ. Nhưng những gì bạn có thể là sử dụng một phương pháp tránh ảnh hưởng của việc không có cơ sở mã làm việc trong nhiều ngày, vài tuần hoặc thậm chí vài tháng.

Phương pháp đó được đặt tên là "Phương pháp Mikado" và nó hoạt động như thế này:

  1. viết ra mục tiêu bạn muốn đạt được trên một tờ giấy

  2. thực hiện thay đổi đơn giản nhất sẽ đưa bạn vào hướng đó.

  3. kiểm tra nếu nó hoạt động bằng trình biên dịch và bộ kiểm tra của bạn. Nếu nó tiếp tục với bước 7. nếu không thì tiếp tục với bước 4.

  4. trên giấy của bạn lưu ý những điều cần thay đổi để làm cho thay đổi hiện tại của bạn hoạt động. Vẽ mũi tên, từ nhiệm vụ hiện tại của bạn, đến những cái mới.

  5. Hoàn nguyên các thay đổi của bạn Đây là bước quan trọng. Nó phản tác dụng trực quan và đau đớn về thể chất ngay từ đầu, nhưng vì bạn chỉ cần thử một điều đơn giản, nên nó không thực sự tệ đến thế.

  6. chọn một trong các nhiệm vụ không có lỗi gửi đi (không có phụ thuộc đã biết) và quay lại 2.

  7. cam kết thay đổi, gạch bỏ nhiệm vụ trên giấy, chọn một nhiệm vụ không có lỗi gửi đi (không có phụ thuộc đã biết) và quay lại 2.

Bằng cách này, bạn sẽ có một cơ sở mã làm việc trong khoảng thời gian ngắn. Nơi bạn cũng có thể hợp nhất các thay đổi từ phần còn lại của nhóm. Và bạn có một đại diện trực quan về những gì bạn biết bạn vẫn phải làm, điều này giúp quyết định xem bạn muốn tiếp tục với mục đích cuối cùng hay liệu bạn nên dừng nó lại.


2

Tái cấu trúc là một môn học có cấu trúc, khác với việc làm sạch mã khi bạn thấy phù hợp. Bạn cần phải có các bài kiểm tra đơn vị được viết trước khi bắt đầu và mỗi bước nên bao gồm một chuyển đổi cụ thể mà bạn biết sẽ không thay đổi chức năng. Các bài kiểm tra đơn vị nên vượt qua sau mỗi thay đổi.

Tất nhiên, trong quá trình tái cấu trúc, bạn sẽ tự nhiên phát hiện ra những thay đổi nên được áp dụng có thể gây ra vỡ. Trong trường hợp đó, hãy cố gắng hết sức để thực hiện shim tương thích cho giao diện cũ sử dụng khung mới. Về lý thuyết, hệ thống vẫn hoạt động như trước và các bài kiểm tra đơn vị sẽ vượt qua. Bạn có thể đánh dấu shim tương thích là một giao diện không dùng nữa và dọn sạch nó vào thời điểm phù hợp hơn.


2

... Tôi đã cấu trúc lại dự án để thêm tính năng này.

Như đã nói @Jules, Tái cấu trúc và thêm các tính năng là hai điều rất khác nhau.

  • Tái cấu trúc là về việc thay đổi cấu trúc của chương trình mà không thay đổi hành vi của nó.
  • Thêm một tính năng, mặt khác, là tăng cường hành vi của nó.

... nhưng thực sự, đôi khi bạn cần thay đổi hoạt động bên trong để thêm nội dung của mình, nhưng tôi muốn gọi nó là sửa đổi hơn là tái cấu trúc.

Tôi cần phải thực hiện một thay đổi giao diện nhỏ để phù hợp với nó

Đó là nơi mọi thứ trở nên lộn xộn. Các giao diện có nghĩa là các ràng buộc để cô lập việc thực hiện với cách nó được sử dụng. Ngay khi bạn chạm vào các giao diện, mọi thứ ở hai bên (thực hiện hoặc sử dụng nó) cũng sẽ phải được thay đổi. Điều này có thể lan xa khi bạn trải nghiệm nó.

sau đó lớp tiêu thụ không thể được thực hiện với giao diện hiện tại của nó theo giao diện mới, vì vậy nó cũng cần một giao diện mới.

Giao diện đó yêu cầu một sự thay đổi nghe có vẻ ổn ... rằng nó lan sang một giao diện khác ngụ ý những thay đổi còn lan rộng hơn nữa. Có vẻ như một số hình thức đầu vào / dữ liệu yêu cầu để chảy xuống chuỗi. Có phải vậy không?


Bài nói của bạn rất trừu tượng, vì vậy thật khó để tìm ra. Một ví dụ sẽ rất hữu ích. Thông thường, các giao diện phải khá ổn định và độc lập với nhau, giúp có thể sửa đổi một phần của hệ thống mà không làm hại phần còn lại ... nhờ các giao diện.

... trên thực tế, cách tốt nhất để tránh tầng sửa đổi mã là chính xác tốt giao diện. ;)


-1

Tôi nghĩ bạn thường không thể trừ khi bạn sẵn sàng giữ mọi thứ như hiện tại. Tuy nhiên, khi các tình huống như của bạn, tôi nghĩ điều tốt hơn là thông báo cho nhóm và cho họ biết lý do tại sao nên thực hiện một số tái cấu trúc để tiếp tục phát triển lành mạnh hơn. Tôi sẽ không đi và sửa chữa mọi thứ một mình. Tôi sẽ nói về nó trong các cuộc họp Scrum (giả sử các bạn có chúng) và tiếp cận nó một cách có hệ thống với các nhà phát triển khác.


1
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 9 câu trả lời trước
gnat

@gnat: Có thể không, nhưng đơn giản hóa các câu trả lời.
Tarik
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.