我正在构建一个DDD系统,我们已经为已经设置的系统提供了纸上的所有要求.关于我们如何构建我需要意见的域模型存在分歧.
我倾向于采用这些要求并勾画出一个基本的域模型,其中包含类,它们的属性和行为以及白板或visio上的关系的大纲.然后,我开始构建单元测试,用于逐个构建和测试我的模型.
我的同事似乎认为这不是很好的TDD + DDD练习.他们认为你不应该勾勒出任何东西并开始构建测试,并在你完成测试的"感觉"时设计你的模型.
在构建DDD模型时,哪一种被认为是"正确的"TDD技术?
我的应用程序在Canvas周围激活精灵实例,然后在屏幕上朝着ax/y坐标移动.我希望能够围绕其中心旋转精灵,使其面向目标坐标.我正在使用精灵表,并有剪切问题.我也找到了很多很好的例子,但似乎没有任何东西可以覆盖我正在寻找的东西.这个例子非常接近,但为了提高效率,我使用的是ImagePooler类,无法在每次绘制/旋转时重新加载图像.因此,如果有人知道如何旋转预装的图像w/out切割我的精灵表,我将非常感激.
我对单元测试和TDD非常环保,所以请问我,因为我问一些人可能会考虑新手问题,或者之前是否有过这个问题.如果这被认为是一个"不好的问题"(过于主观和公开辩论),我会高兴地关闭它.但是,我搜索了几天,并没有得到明确的答案,我需要更好地理解这一点,所以我知道没有更好的方法来获取更多信息而不是发布在这里.
我已经开始阅读一本关于单元测试的旧书了(因为一位同事手头有这本书),其开篇章节讨论了为什么要进行单元测试.其中一点是,从长远来看,您的代码更可靠,更清晰,更不容易出错.它还指出,有效的单元测试将使跟踪和修复错误变得更加容易.所以它似乎关注于整体预防/减少代码中的错误.
另一方面,我还发现了一篇关于编写优秀单元测试的文章,并指出单元测试的目标是使您的设计更加健壮,相反,发现错误是手动测试的目标,而不是单元测试.
因此,作为TDD的新手,我对于我应该进入TDD并构建单元测试的心态感到有些困惑.我承认,我现在使用我最近开始的项目的部分原因是因为我厌倦了我的更改破坏了以前的现有代码.诚然,上面的链接文章至少指出这是TDD的一个优势.但我希望通过回到现有代码中添加单元测试(然后从这一点继续TDD)来帮助防止这些错误.
这本书和本文是否真的用不同的语气说同样的话,或者在这个主题上有一些主观性,而我所看到的只是两个人对如何处理TDD有不同的看法?
提前致谢.
我正在使用蓝牙设备(IOIO开发板).
当我的设备断开连接时,我想听.它可以正常使用上面的代码,但它无法立即识别.当我关闭我的蓝牙开发板时,我必须等待~16秒,直到我的Android识别出连接丢失.
有人知道为什么吗?我听说应该是内部的Android限制,连接不经常检查?有人知道如何编写一个"ping"蓝牙设备的线程吗?我认为它与Android BluetoothChat示例非常相似,但我无法自行修复它.
谢谢.
费利克斯
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter1);
this.registerReceiver(mReceiver, filter2);
Run Code Online (Sandbox Code Playgroud)
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
//Device is about to disconnect
Toast.makeText(context,"The device is about to disconnect" , Toast.LENGTH_LONG).show();
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
//Device has disconnected
Toast.makeText(context,"Device has disconnected" …Run Code Online (Sandbox Code Playgroud) 为什么当我们得到数组的长度时,我们不必放置()
int [] ar;
System.out.println(ar.length); // no parentheses
Run Code Online (Sandbox Code Playgroud)
但对于一个字符串,它将是
String st;
System.out.println(st.length());
Run Code Online (Sandbox Code Playgroud) 我们正在重构一个很长的方法; 它包含一个包含for许多continue语句的长循环.我想使用Extract Method重构,但Eclipse的自动化重构不知道如何处理条件分支.我也没有.
我们当前的策略是引入一个keepGoing标志(一个实例变量,因为我们想要提取方法),在循环顶部将它设置为false,并将每个continue替换为将标志设置为true,然后包装所有在if (keepGoing)子句中跟随东西(在不同的嵌套级别).然后执行各种提取,然后用keepGoing提取的方法中的早期返回替换赋值,然后去除该标志.
有没有更好的办法?
更新:回应评论 - 我无法分享代码,但这是一个匿名的摘录:
private static void foo(C1 a, C2 b, C3 c, List<C2> list, boolean flag1) throws Exception {
for (int i = 0; i < 1; i++) {
C4 d = null;
Integer e = null;
boolean flag2 = false;
boolean flag3 = findFlag3(a, c);
blahblahblah();
if (e == null) {
if (flag1) {
if (test1(c)) {
if …Run Code Online (Sandbox Code Playgroud) 我有一种方法,其中性能非常重要(我知道过早的优化是所有邪恶的根源.我知道我应该并且我确实对我的代码进行了描述.在这个应用程序中,每十分之一秒我保存是一个很大的胜利.)这种方法使用不同的启发式方法来生成和返回元素.试探法被用来顺序地:所述第一试探法使用,直到它不再返回元件,则第二试探法使用直到它可以直到所有启发式已经使用不再返回元件等.在方法的每次调用中,我使用开关移动到右侧启发式.这很难看,但效果很好.这是一些伪代码
class MyClass
{
private:
unsigned int m_step;
public:
MyClass() : m_step(0) {};
Elem GetElem()
{
// This switch statement will be optimized as a jump table by the compiler.
// Note that there is no break statments between the cases.
switch (m_step)
{
case 0:
if (UseHeuristic1())
{
m_step = 1; // Heuristic one is special it will never provide more than one element.
return theElem;
}
m_step = 1;
case 1:
DoSomeOneTimeInitialisationForHeuristic2();
m_step = 2;
case 2:
if …Run Code Online (Sandbox Code Playgroud) SQL Server中是否有关键字或元信息会告诉您TOP是否生效?
EX:
Select TOP 5 * From Stuff
RESULT: 5 rows
Run Code Online (Sandbox Code Playgroud)
确定是否有6个或更多的最佳方法是什么?
I could do:
SELECT TOP 6 count(*) FROM Stuff
Run Code Online (Sandbox Code Playgroud)
但我担心单独调用检索计数,因为实际查询比这个和大型表复杂得多.
谢谢!
我有以下规格
BidirectionalGraph Fixture = new BidirectionalGraph();
public void VerticesShouldBeAbleToAssociateMultipleEdges()
{
int a = 0;
int b = 1;
int c = 2;
Fixture.AddEdge(a, b);
Fixture.AddEdge(b, c);
Fixture.AddEdge(c, a);
Fixture.EdgesFrom(a).Should().BeEquivalentTo
( new []{a, b}
, new []{a, c});
}
Run Code Online (Sandbox Code Playgroud)
其中 EdgesFrom 定义如下
public IEnumerable<int[]> EdgesFrom(int vertex)
Run Code Online (Sandbox Code Playgroud)
但是我的测试失败了
Result Message: Expected collection
{{0, 1}, {0, 2}} to be equivalent to
{{0, 1}, {0, 2}}.
Run Code Online (Sandbox Code Playgroud)
这对我来说不太有意义,因为它们显然是等效的。FluentAssertions在比较集合的集合时不起作用吗?
众所周知,AWS Timestream 已于上周正式发布。
从那时起,我一直在尝试对它进行试验并了解它如何建模和存储数据。
我在将记录摄取到 Timestream 时遇到问题。我有一些日期为 2020 年 4 月 23 日的记录。在尝试将这些记录插入时间流表时,我收到 RecordRejected 错误。根据此链接,如果记录具有相同的维度、时间戳或时间戳超出表的内存存储的保留期,则会拒绝记录。
我已将表的内存存储的保留期设置为 12 个月。根据文档:任何时间戳超过 12 个月的记录都将被拒绝。然而,尽管上面提到的记录在 12 个月内有时间戳,但还是被拒绝了。
在进一步调查中,我注意到,今天日期(2020 年 10 月 5 日)的记录被成功摄取,但是,日期为 30 天前的记录(即 2020 年 9 月 5 日)不会被摄取。为确保这一点,我还尝试插入日期为 9 月 6 日和今天日期和 9 月 5 日之间还有几天的记录。所有这些都已成功插入。
有人可以解释为什么我无法在内存存储的保留期内插入具有时间戳的记录吗?它只允许我插入最多 30 天的记录。我也想知道是否有一种方法可以将历史数据直接插入到磁存储中。内存存储保留期可能不足以满足我的用例,我可能需要插入 2 年或更长时间的数据。我知道这不是时间流的经典用例,但我仍然很想知道。
我被困在这个问题上,非常感谢一些帮助。
先感谢您。
tdd ×3
android ×2
java ×2
refactoring ×2
algorithm ×1
bluetooth ×1
c# ×1
c++ ×1
collections ×1
debugging ×1
model ×1
oop ×1
sprite-sheet ×1
sql ×1
sql-server ×1
unit-testing ×1