我刚刚开始使用TDD并很快遇到了一堵砖墙。这是我的情景...... 我正在尝试对一个Image对象进行建模,并且通过TDD步骤我已经开始使用一个简单的对象,最终会成长为......
public class ImageObject
{
public string Name {get; set;}
public int Width {get; set;}
public int Height {get; set;}
public bool IsValid()
{
//Some rules
}
}
当然是强制性测试......
[Test]
public void ImageWidthCannotBeLessThanZero {...}
[Test]
public void ImageHeightCannotBeLessThanZero {...}
and so forth...
到目前为止一切顺利。接下来,我想以某种方式表示类中的物理文件。它可以是文件路径
public class ImageObject
{
public string Path {get; set;}
}
或一系列字节
public class ImageObject
{
public byte[] Bytes {get; set;}
}
(请注意,这不是关于DB与存储文件系统的争论。)
此时我感觉不舒服,因为我的思绪正在漂移并开始考虑基础设施/实施细节。 我的缺点在哪里?我应该在实施细节上做出决定吗?我需要一个聪明的设计模式来处理这个问题吗?模拟框架会有帮助吗?这是一个对象分析/设计问题,我应该使用UML工具? (等一下,我认为TDD是关于设计的?)
无论如何,我如何克服这个问题?我想继续专注于设计我的对象,而不是在此时考虑基础设施问题吗?
答案 0 :(得分:2)
我想你可能会在错误的地方开始。你说'接下来,我想以某种方式代表课堂上的物理文件' - 为什么?什么测试失败导致需要表示物理文件?
一个问题是你通过公共财产揭露代表 - 这真的是你想要做的吗?或者物理表示是否可以保密,只能通过您选择实施的某些操作进行访问(例如'LoadImage()','GetImageBytes()')?如果它保密,那么测试对于实现来说并不重要。
答案 1 :(得分:1)
在TDD中,正在开发的课程应以外向视角来考虑。图像来自哪里?你打算用图片做什么?显示它?通过网络发送?对它进行一些改造?插入画廊?答案将给出方向。而下一个测试要写。测试应指导设计,而不是Image类。
实际上,对于绘图应用程序,库生成器或电子邮件阅读器,ImageObject将是不同的,因为将使用此类的类具有不同的需求。
答案 2 :(得分:1)
你过分关注这个类的建模,而不是实现一个实际的场景。
imho这对使用TDD时如何解决问题有很大的不同。
这使您无法在课程中添加不必要的元素,并且可以让您在前期分析时间更短的情况下实现更简单的设计。
专注于您需要实施的方案。这样就可以满足您对这些课程的需求以及您需要的课程。