Miền kiến thức của chúng tôi liên quan đến những người đi bộ trên một tấm ghi áp lực bằng đôi chân trần của họ. Chúng tôi thực hiện nhận dạng hình ảnh dẫn đến các đối tượng của lớp 'Chân', nếu chân người được nhận dạng trong dữ liệu cảm biến.
Có một số tính toán phải được thực hiện trên dữ liệu của bàn chân.
Bây giờ, API nào sẽ tốt hơn:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
Hoặc là:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
Bây giờ, có rất nhiều pro và con tôi có thể nghĩ ra, nhưng tôi thực sự không thể quyết định đâu là quan trọng nhất. Lưu ý, đây là một ứng dụng người dùng cuối, không phải thư viện phần mềm chúng tôi bán.
Có lời khuyên nào không?
Một số pro cho cách tiếp cận đầu tiên có thể là:
- KISS - mọi thứ đều rất cụ thể. API, nhưng việc thực hiện là tốt.
- gõ mạnh giá trị trả về.
- kế thừa từ lớp này là bằng chứng ngu ngốc. Không có gì có thể được ghi đè, chỉ được thêm vào.
- API rất kín, không có gì đi vào, không có gì có thể bị ghi đè, do đó ít có thể sai.
Một số con:
- Số lượng getters sẽ tăng lên, vì mọi tính toán mới mà chúng tôi phát minh được thêm vào danh sách
- API có nhiều khả năng thay đổi và nếu giới thiệu các thay đổi được giới thiệu, chúng tôi cần một phiên bản API mới, Foot2.
- trong trường hợp sử dụng lại lớp trong các dự án khác, chúng tôi có thể không cần mọi tính toán
Một số pro cho cách tiếp cận thứ hai:
- Linh hoạt hơn
- api ít có khả năng thay đổi, (giả sử chúng ta đã trừu tượng hóa chính xác, nếu không, thay đổi sẽ có giá cao hơn)
Một số con:
- đánh máy lỏng lẻo. Cần phôi trên mỗi cuộc gọi.
- tham số chuỗi - Tôi có cảm giác xấu về điều đó (phân nhánh trên các giá trị chuỗi ...)
- Không có trường hợp / yêu cầu sử dụng hiện tại bắt buộc phải linh hoạt thêm, nhưng có thể có trong tương lai.
- API áp đặt các hạn chế: mọi tính toán cần xuất phát từ một lớp cơ sở. Việc tính toán sẽ được thực hiện thông qua phương pháp 1 này và việc truyền các tham số bổ sung sẽ là không thể, trừ khi chúng ta nghĩ ra một cách truyền linh hoạt hơn, siêu linh hoạt hơn để tăng độ phức tạp hơn nữa.
getCalculation()
.
enum
và bật các giá trị của nó. Tuy nhiên, tôi nghĩ rằng lựa chọn thứ hai là xấu xa, bởi vì nó đi chệch khỏi KISS.