Tôi vừa đọc một đoạn trích của cuốn sách "Phát triển phần mềm hướng đối tượng" giải thích một số lý do tại sao không khuyến khích lớp bê tông.
Dưới đây là một số mã mẫu của bài kiểm tra đơn vị cho lớp MusicCentre:
public class MusicCentreTest {
@Test public void startsCdPlayerAtTimeRequested() {
final MutableTime scheduledTime = new MutableTime();
CdPlayer player = new CdPlayer() {
@Override
public void scheduleToStartAt(Time startTime) {
scheduledTime.set(startTime);
}
}
MusicCentre centre = new MusicCentre(player);
centre.startMediaAt(LATER);
assertEquals(LATER, scheduledTime.get());
}
}
Và lời giải thích đầu tiên của anh ấy:
Vấn đề với cách tiếp cận này là nó để lại mối quan hệ giữa các đối tượng ngầm. Tôi hy vọng chúng ta đã nói rõ rằng ý định phát triển dựa trên thử nghiệm với các đối tượng giả là khám phá mối quan hệ giữa các đối tượng. Nếu tôi phân lớp, không có gì trong mã miền để hiển thị mối quan hệ như vậy, chỉ là các phương thức trên một đối tượng. Điều này làm cho khó khăn hơn để xem liệu dịch vụ hỗ trợ mối quan hệ này có thể có liên quan ở nơi khác hay không và tôi sẽ phải làm lại phân tích lần sau khi tôi làm việc với lớp.
Tôi không thể hiểu chính xác ý anh ta khi anh ta nói:
Điều này làm cho khó khăn hơn để xem liệu dịch vụ hỗ trợ mối quan hệ này có thể có liên quan ở nơi khác hay không và tôi sẽ phải làm lại phân tích lần sau khi tôi làm việc với lớp.
Tôi hiểu rằng dịch vụ tương ứng với MusicCentre
phương thức được gọi startMediaAt
.
Anh ta có ý gì bởi "nơi khác"?
Đoạn trích hoàn chỉnh có tại đây: http://www.mockobjects.com/2007/04/test-smell-mocking-concittle-classes.html