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 là 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_cast
thô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 g
hoạ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 f
cầ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ứ f
kế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ũ f
thành mới f
và 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.