Tôi đã đọc về điều này "Luật Demeter", và nó (và tinh khiết "wrapper" các lớp học nói chung) dường như nói chung là mô hình chống. Hãy xem xét một lớp thực hiện:Máy đóng gói/luật của demeter có vẻ là một mẫu chống
class FluidSimulator {
void reset() { /* ... */ }
}
Bây giờ xem xét hai hiện thực khác nhau của lớp khác:
class ScreenSpaceEffects1 {
private FluidSimulator _fluidDynamics;
public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
}
class ScreenSpaceEffects2 {
private FluidSimulator _fluidDynamics;
public void resetFluidSimulation() { _fluidDynamics.reset(); }
}
Và cách để gọi cho biết phương pháp:
callingMethod() {
effects1.getFluidSimulator().reset(); // Version 1
effects2.resetFluidSimulation(); // Version 2
}
Tại blush đầu tiên, phiên bản 2 có vẻ đơn giản hơn một chút, và tuân theo "quy tắc của Demeter", ẩn triển khai của Foo, v.v. Nhưng điều này liên kết bất kỳ thay đổi nào trong FluidSimulator với ScreenSpaceEffects. Ví dụ, nếu một tham số được thêm vào thiết lập lại, sau đó chúng ta có:
class FluidSimulator {
void reset(bool recreateRenderTargets) { /* ... */ }
}
class ScreenSpaceEffects1 {
private FluidSimulator _fluidDynamics;
public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
}
class ScreenSpaceEffects2 {
private FluidSimulator _fluidDynamics;
public void resetFluidSimulation(bool recreateRenderTargets) { _fluidDynamics.reset(recreateRenderTargets); }
}
callingMethod() {
effects1.getFluidSimulator().reset(false); // Version 1
effects2.resetFluidSimulation(false); // Version 2
}
Trong cả hai phiên bản, callingMethod cần phải thay đổi, nhưng trong phiên bản 2, ScreenSpaceEffects cũng cần phải được thay đổi. Ai đó có thể giải thích lợi thế của việc có một wrapper/mặt tiền (với ngoại lệ của adapter hoặc gói một API bên ngoài hoặc lộ một nội bộ).
EDIT: Một trong nhiều ví dụ thực tế mà tôi đã chạy vào ví dụ này thay vì một ví dụ nhỏ.
Bạn có nghĩa là "phiên bản 2 có vẻ đơn giản hơn một chút" không? –
Vâng, xin lỗi, sẽ thay đổi –
Phiên bản 1 không tuân theo quy tắc của Demeter. Mistype? – Corwin