Tôi sẽ cung cấp một chút khác nhau về điều này. Một thư viện cốt lõi, trong nhiều trường hợp, là một ý tưởng tuyệt vời!
Nếu bạn có hai dự án riêng biệt, chúng nên nằm trong hai kho mã riêng biệt. Bây giờ họ phụ thuộc vào chức năng chung. Hãy xem xét ví dụ các ứng dụng xử lý gói. Các chức năng phổ biến có thể bao gồm:
- Cấp phát bộ nhớ
- Địa chỉ Nghị quyết Nghị định thư
- Cây AVL
- Mã tuần tự hóa cho các giao thức nhị phân
- Mảng động
- Danh sách băm kiểu nhân Linux với đầu được liên kết đơn và các nút giữa được liên kết đôi
- Bảng băm
- Mã xử lý tiêu đề TCP / IP
- Danh sách liên kết thường xuyên với đầu được liên kết đôi và các nút giữa được liên kết đôi
- Thư viện đăng nhập
- Linh tinh (tin tôi đi, bạn cần cái này cho những thứ nhỏ nhặt và tầm thường hoặc số lượng mô-đun khác nhau của bạn sẽ lên tới 100!)
- Thư viện chụp gói
- Thư viện giao diện gói I / O
- Cấu trúc dữ liệu gói
- Chặn hàng đợi để liên lạc giữa các luồng
- Máy tạo số ngẫu nhiên
- Cây đỏ đen
- Một số loại thực hiện hẹn giờ
Bây giờ, các ứng dụng xử lý gói khác nhau có thể cần một tập hợp con khác nhau. Bạn nên triển khai một thư viện lõi với một kho lưu trữ mã nguồn, hay bạn nên có 18 kho lưu trữ khác nhau cho mỗi mô-đun này? Hãy nhớ rằng các mô-đun này có thể có các phụ thuộc lẫn nhau, vì vậy hầu hết các mô-đun này có thể phụ thuộc vào ví dụ mô-đun linh tinh.
Tôi sẽ tuyên bố rằng có một thư viện cốt lõi là cách tiếp cận tốt nhất. Nó làm giảm chi phí của nhiều kho mã nguồn. Nó làm giảm địa ngục phụ thuộc: một phiên bản cụ thể của bộ cấp phát bộ nhớ có thể cần một phiên bản cụ thể của mô-đun linh tinh. Và nếu bạn muốn cấp phát bộ nhớ phiên bản 1.7 tùy thuộc vào phiên bản cây 2.5 và AVL linh tinh 1.2 tùy thuộc vào linh tinh 2.6 thì sao? Bạn không thể liên kết linh tinh 2.5 và linh tinh 2.6 cùng lúc với chương trình của mình.
Vì vậy, hãy tiếp tục và thực hiện cấu trúc sau:
- Kho thư viện lõi
- Kho dự án số 1
- Kho dự án số 2
- ...
- Kho lưu trữ dự án #N
Tôi đã thấy rằng chuyển sang loại cấu trúc này từ cấu trúc:
- Kho dự án số 1
- Kho dự án số 2
- ...
- Kho lưu trữ dự án #N
Đã dẫn đến giảm bảo trì và tăng chia sẻ mã thông qua các cơ chế không sao chép.
Tôi cũng đã thấy các dự án sử dụng cấu trúc sau:
- Kho phân bổ bộ nhớ
- Kho lưu trữ giao thức phân giải địa chỉ
- Kho lưu trữ cây AVL
- Mã tuần tự hóa cho kho lưu trữ giao thức nhị phân
- Kho lưu trữ mảng động
- Danh sách băm kiểu nhân Linux với đầu liên kết đơn và kho lưu trữ nút giữa được liên kết đôi
- Kho băm bảng
- Kho lưu trữ mã xử lý tiêu đề TCP / IP
- Danh sách được liên kết thường xuyên với đầu được liên kết đôi và kho lưu trữ nút giữa được liên kết đôi
- Ghi nhật ký kho thư viện
- Kho lưu trữ linh tinh (tin tôi đi, bạn cần cái này cho những thứ nhỏ nhặt và tầm thường hoặc số lượng mô-đun khác nhau của bạn sẽ lên tới 100!)
- Kho thư viện chụp gói
- Kho lưu trữ thư viện giao diện I / O
- Kho lưu trữ cấu trúc dữ liệu gói
- Chặn hàng đợi cho kho lưu trữ liên lạc giữa các luồng
- Kho lưu trữ số ngẫu nhiên
- Kho lưu trữ cây đỏ-đen
- Một số loại kho lưu trữ thực hiện hẹn giờ
- Kho dự án số 1
- Kho dự án số 2
- ...
- Kho lưu trữ dự án #N
... và địa ngục phụ thuộc và sự gia tăng số lượng kho lưu trữ là những vấn đề thực sự.
Bây giờ, bạn có nên sử dụng một thư viện mã nguồn mở hiện tại thay vì viết riêng của bạn không? Bạn cần xem xét:
- Vấn đề giấy phép. Đôi khi, yêu cầu đơn thuần để cung cấp tín dụng cho tác giả trong tài liệu được cung cấp có thể quá nhiều, vì 20 thư viện thường sẽ có 20 tác giả khác nhau.
- Hỗ trợ phiên bản hệ điều hành khác nhau
- Phụ thuộc của thư viện cụ thể
- Kích thước của thư viện cụ thể: nó có quá lớn so với chức năng được cung cấp không? Liệu nó có cung cấp quá nhiều tính năng?
- Là liên kết tĩnh có thể? Là liên kết năng động mong muốn?
- Là giao diện của thư viện những gì bạn muốn? Lưu ý rằng trong một số trường hợp, việc viết một trình bao bọc để cung cấp giao diện mong muốn có thể dễ dàng hơn việc tự viết lại toàn bộ thành phần.
- ... và nhiều, nhiều thứ khác tôi chưa đề cập trong danh sách này
Tôi thường sử dụng quy tắc rằng mọi thứ dưới 1000 dòng mã không yêu cầu thứ gì đó vượt quá chuyên môn của lập trình viên nên được tự mình thực hiện. Lưu ý: 1000 dòng bao gồm các bài kiểm tra đơn vị. Vì vậy, tôi chắc chắn sẽ không ủng hộ việc tự viết 1000 dòng mã nếu nó yêu cầu 10 000 dòng bổ sung cho các bài kiểm tra đơn vị. Đối với các chương trình xử lý gói của tôi, điều này có nghĩa là các thành phần bên ngoài duy nhất tôi đã sử dụng là:
- Mọi thứ được cung cấp bởi một bản phân phối Linux tiêu chuẩn, bởi vì nó có quá nhiều dòng mã mà nó không có ý nghĩa để thực hiện lại Linux. Các phần của việc triển khai lại Linux cũng sẽ vượt quá trình độ chuyên môn của tôi.
- Bison / flex vì phân tích cú pháp LALR vượt quá trình độ chuyên môn của tôi và hơn 1000 dòng mã. Tôi chắc chắn có thể tự mình viết một trình phân tích cú pháp gốc đệ quy, nhưng Bison / flex rất tiện dụng tôi thấy chúng là hữu ích.
- Netmap, vì nó hơn 1000 dòng và vượt quá trình độ chuyên môn của tôi
- Bỏ qua triển khai bộ đếm thời gian dựa trên danh sách từ DPDK, vì nó vượt quá trình độ chuyên môn của tôi mặc dù nó ít hơn 1000 dòng mã (mặc dù tôi có các triển khai hẹn giờ thay thế không sử dụng danh sách bỏ qua)
Một số điều tôi đã tự thực hiện vì chúng đơn giản bao gồm cả những thứ như:
- MurMurHash
- SipHash
- Mersenne Twister
... bởi vì việc triển khai tùy chỉnh này có thể cho phép nội tuyến nặng, dẫn đến hiệu suất được cải thiện.
Tôi không làm mật mã; nếu tôi đã làm, tôi sẽ thêm một số loại thư viện tiền điện tử vào danh sách, vì tự mình viết thuật toán mật mã có thể dễ bị tấn công bộ đệm thời gian ngay cả khi bạn có thể kiểm tra đơn vị kỹ lưỡng cho thấy chúng tương thích với các thuật toán chính thức.