Tái sử dụng mã là một ý tưởng khá tốt. Không phải là một trong những tuyệt vời .
Tôi có một viễn cảnh được rút ra từ khoảng 30 năm công nghệ phần mềm, cố gắng "tái sử dụng".
Tôi bắt đầu nghiên cứu "tái sử dụng mã" như một chủ đề nghiên cứu từ những năm 80, sau khi phát hiện ra tôi đã sử dụng lại thiết kế của một hệ điều hành tôi xây dựng vào đầu những năm 70, cho một hệ điều hành khác mà tôi đã xây dựng vào cuối những năm 70.
Phần tốt của việc tái sử dụng mã là khả năng đôi khi sử dụng lại mã có từ trước trung thực. Nhưng thế giới đầy mã; Làm thế nào có thể tìm thấy những gì bạn muốn? Đây là những gì tôi gọi là Lời nguyền tái sử dụng :
Tôi là Santa Claus (ok Mã nguồn mở) và tôi có một túi gồm 1 tỷ thành phần phần mềm. Bạn có thể có bất kỳ một trong số họ.
Chúc may mắn lựa chọn.
Để giải quyết vấn đề tái sử dụng tốt:
- người tái sử dụng cần xác định bằng cách nào đó những gì anh ta cần (chức năng, hiệu suất, ngôn ngữ đích, giả định môi trường, ...)
- phải có một thư viện mã "tái sử dụng" được lập chỉ mục theo nhiều cách khác nhau theo các tiêu chí tiềm năng này
- một số cơ chế phải tồn tại để chọn ra các yếu tố ứng cử viên (ở một tỷ yếu tố, bạn không thể xem xét tất cả các yếu tố cá nhân)
- cần phải có một cách để mô tả đặc điểm cách xa các đặc điểm kỹ thuật của các ứng cử viên được chọn
- một số quy trình thông thường nên tồn tại để cho phép người sử dụng sửa đổi mã có thể sử dụng lại được chọn (đây là đóng góp lớn nhất của OOP: bạn có thể chỉnh sửa một thành phần / đối tượng hiện có bằng cách ghi đè các vị trí của nó. OOP không cung cấp bất kỳ trợ giúp nào khác).
- tất cả điều này rõ ràng phải rẻ hơn đơn giản là mã hóa lại
Hầu hết những gì đã được phát hiện trong nhiều năm qua là để mã có thể được sử dụng lại, nó phải được thiết kế cho mục đích đó hoặc nó chứa quá nhiều giả định ngầm định. Các thư viện tái sử dụng mã thành công nhất thực sự là khá nhỏ. Các thư viện và khung công tác có thể là mã "tái sử dụng" và chúng cực kỳ thành công; Java và C # thành công không phải vì chúng là những ngôn ngữ máy tính khá tốt, mà là vì chúng có sẵn các thư viện được thiết kế, triển khai và tài liệu rất lớn. Nhưng mọi người không nhìn vào mã nguồn trong các thư viện; họ chỉ đơn giản gọi một API có tài liệu tốt (được thiết kế để có thể sử dụng được).
Việc tái sử dụng mã nào chưa được thực hiện (OOP cũng không) cung cấp các lệnh cải thiện cường độ trong khả năng của chúng tôi đối với các hệ thống mã.
Tôi nghĩ lỗ hổng quan trọng là bất kỳ loại tái sử dụng mã nào đều bị hạn chế về cơ bản vì mã có quá nhiều giả định được xây dựng . Nếu bạn làm cho mã nhỏ, bạn giảm thiểu các giả định, nhưng sau đó chi phí để xây dựng từ đầu không quá lớn và lợi ích tái sử dụng không hiệu quả. Nếu bạn làm cho các đoạn mã lớn, chúng sẽ trở nên vô dụng trong một bối cảnh mới. Giống như Gulliver, chúng bị buộc vào bãi biển bởi hàng triệu sợi dây nhỏ và bạn chỉ đơn giản là không đủ khả năng để cắt tất cả.
Những gì chúng ta nên làm việc là sử dụng lại kiến thức để xây dựng mã . Nếu chúng ta có thể làm điều này, thì chúng ta có thể áp dụng kiến thức đó để xây dựng mã mà chúng ta cần, xử lý các giả định hiện tại.
Để làm điều này, người ta vẫn cần khả năng đặc tả tương tự để mô tả các thành phần phần mềm (bạn vẫn phải nói những gì bạn muốn!). Nhưng sau đó, bạn áp dụng kiến thức "xây dựng" này vào các thông số kỹ thuật để tạo mã bạn muốn.
Là một cộng đồng, chúng tôi chưa giỏi về điều này. Nhưng mọi người làm điều đó mọi lúc; Tại sao chúng ta không thể tự động hóa nó? Có rất nhiều nghiên cứu, và điều này cho thấy nó có thể được thực hiện trong nhiều trường hợp.
Một phần chính của máy móc cần thiết cho việc này là các công cụ cơ học để chấp nhận "mô tả thành phần" (đây chỉ là các tài liệu chính thức và có thể được phân tích cú pháp như ngôn ngữ lập trình) và áp dụng các biến đổi chương trình cho chúng.
Trình biên dịch đã làm điều này: -} Và họ thực sự giỏi trong lớp vấn đề mà họ giải quyết.
Các mô hình UML với việc tạo mã là một nỗ lực để làm điều này. Không phải là một nỗ lực rất tốt; hầu như những gì người ta nói trong hầu hết các mô hình UML là "Tôi có dữ liệu giống như thế này". Khá khó để tạo ra một chương trình thực sự nếu chức năng bị bỏ qua.
Tôi đang cố gắng xây dựng các hệ thống chuyển đổi chương trình thực tế, một công cụ gọi là DMS . Đã bị phân tâm khá tốt bằng cách áp dụng các biến đổi chương trình không quá nhiều vào các đặc tả trừu tượng để tạo mã, mà thay vào đó là mã kế thừa để dọn sạch nó. (Đây là cùng một vấn đề trong bản tóm tắt!). (Để xây dựng các công cụ như vậy tốn rất nhiều thời gian; tôi đã làm việc này trong 15 năm và trong thời gian đó bạn phải ăn).
Nhưng DMS có hai thuộc tính chính mà tôi đã mô tả ở trên: khả năng xử lý các thông số kỹ thuật chính thức tùy ý và khả năng nắm bắt "kiến thức tạo mã" dưới dạng biến đổi và áp dụng chúng theo yêu cầu. Và đáng chú ý, chúng tôi tạo ra trong một số trường hợp đặc biệt, một số mã khá thú vị từ thông số kỹ thuật; DMS phần lớn được xây dựng bằng cách sử dụng chính nó để tạo ra việc thực hiện. Điều đó đã đạt được cho chúng tôi ít nhất một số lời hứa về việc sử dụng lại (kiến thức): tăng năng suất cực kỳ đáng kể. Tôi có một đội ngũ khoảng 7 người kỹ thuật; chúng tôi đã viết 1-2 MSLOC về "thông số kỹ thuật" cho DMS, nhưng có một số 10MSLOC mã được tạo.
Tóm tắt: tái sử dụng kiến thức thế hệ là chiến thắng, không sử dụng lại mã .