Đây là một câu hỏi khá mơ hồ, nhưng đó là điều mà tôi chưa bao giờ cảm thấy đã được trả lời một cách thỏa đáng khi đọc về thiết kế phù hợp.
Nói chung, khi tìm hiểu về lập trình hướng đối tượng, trừu tượng hóa, bao thanh toán, v.v., chén thánh thiết kế - và lý do họ luôn cho rằng bạn đang sử dụng các kỹ thuật phát triển trong câu hỏi - là nó sẽ làm cho chương trình của bạn "dễ thay đổi" , "duy trì", "linh hoạt" hoặc bất kỳ từ đồng nghĩa nào được sử dụng để diễn đạt một khái niệm nghe có vẻ hiệu quả như vậy. Bằng cách đánh dấu ivars riêng tư, chia mã thành nhiều phương thức nhỏ, khép kín, giữ cho giao diện chung, bạn được cho là có khả năng sửa đổi chương trình của mình một cách dễ dàng và duyên dáng.
Đối với những thay đổi tương đối nhỏ, điều này đã làm việc tốt cho tôi. Thay đổi cấu trúc dữ liệu nội bộ được sử dụng bởi một lớp để tăng hiệu suất chưa bao giờ là một khó khăn lớn và cũng không có thay đổi nào đối với đầu giao diện người dùng, độc lập với API, như thiết kế lại hệ thống nhập văn bản hoặc đại tu đồ họa cho thành phần chơi trò chơi .
Tất cả những thay đổi này dường như khép kín. Không ai trong số họ liên quan đến bất kỳ thay đổi nào đối với hành vi hoặc thiết kế của thành phần chương trình của bạn đang được sửa đổi, theo như mã bên ngoài mà nó liên quan. Cho dù bạn có viết theo thủ tục hay theo kiểu OO, với các chức năng lớn hay nhỏ, đây là những thay đổi dễ dàng thực hiện ngay cả khi bạn chỉ có một thiết kế tốt vừa phải.
Tuy nhiên, bất cứ khi nào các thay đổi trở nên lớn và nhiều lông - nghĩa là thay đổi API - không có "mẫu" quý giá nào của tôi từng được giải cứu. Sự thay đổi lớn vẫn còn lớn, mã bị ảnh hưởng vẫn bị ảnh hưởng và nhiều giờ làm việc sinh ra lỗi nằm trước tôi.
Vì vậy, câu hỏi của tôi là này. Làm thế nào lớn thay đổi yêu cầu thiết kế phù hợp để có thể tạo điều kiện? Có một số kỹ thuật thiết kế nào khác, mà tôi không biết hoặc tôi đã không thực hiện, điều đó thực sự làm cho việc sửa đổi âm thanh trở nên đơn giản, hoặc đó là lời hứa (mà tôi đã nghe được thực hiện bởi rất nhiều mô hình khác nhau) chỉ là một ý tưởng hay, hoàn toàn mất kết nối với sự thật bất biến của phát triển phần mềm? Có "công cụ thay đổi" nào tôi có thể thêm vào toolbelt của mình không?
Cụ thể, vấn đề tôi gặp phải đã dẫn tôi đến các diễn đàn là: Tôi đã làm việc để thực hiện một ngôn ngữ lập trình được giải thích (được triển khai trong D, nhưng điều đó không liên quan), và tôi đã quyết định rằng các lập luận của tôi nên được đưa ra dựa trên từ khóa, thay vì theo vị trí như hiện tại. Điều này đòi hỏi phải sửa đổi tất cả các mã hiện có gọi các hàm ẩn danh, điều may mắn là khá nhỏ vì tôi sớm phát triển ngôn ngữ của mình (<2000 dòng), nhưng sẽ rất lớn nếu tôi đưa ra quyết định này ở giai đoạn sau. Trong tình huống như vậy, có cách nào mà bằng tầm nhìn xa phù hợp trong thiết kế tôi có thể thực hiện việc sửa đổi này dễ dàng hơn, hoặc chắc chắn (hầu hết) thay đổi về bản chất là sâu rộng? Tôi tò mò liệu đây có phải là một thất bại trong kỹ năng thiết kế của riêng tôi không - nếu có, tôi
Để rõ ràng, tôi không nghi ngờ gì về OOP hoặc bất kỳ mẫu nào khác thường được sử dụng. Đối với tôi, tuy nhiên, đức tính của họ là trong văn bản gốc, thay vì duy trì, các cơ sở mã. Kế thừa cho phép bạn mô hình hóa lặp đi lặp lại một cách rõ ràng, tính đa hình cho phép bạn tách mã theo hàm do con người hiểu (lớp nào) thay vì hiệu ứng hiểu máy (nhánh nào của switch
câu lệnh) và các hàm nhỏ, khép kín cho phép bạn viết theo kiểu "từ dưới lên" rất dễ chịu. Tuy nhiên, tôi nghi ngờ về tuyên bố linh hoạt của họ.
foo metarg1: bar metarg2: baz
như foo.metarg1_metarg2_(bar, baz)
. Tuy nhiên, ngôn ngữ của tôi đang thực hiện một thay đổi lớn hơn, cụ thể là liệt kê các tham số dựa trên tham số từ điển, điều này ảnh hưởng đến thời gian chạy nhưng thực tế không phải là trình phân tích cú pháp do các thuộc tính cụ thể của ngôn ngữ của tôi mà tôi sẽ không truy cập ngay bây giờ. Vì không có ánh xạ rõ ràng giữa các đối số từ khóa không theo thứ tự và vị trí, nên thời gian chạy là vấn đề chính.