不确定Bold/Eco在Borland/Codegear/Embarcadero过渡期间发生了什么,但我确实在新版本的Delphi中错过了它.有人知道一个接近的框架吗?
如果没有,也许你可以建议一个接近的库和组件的组合.
这纯粹是出于好奇.我正在浏览一篇比较各种字符串搜索算法的文章,并注意到它们都是为了找到第一个匹配的子字符串而设计的.这让我想到......如果我想找到所有出现的子串怎么办?
我确信我可以创建一个使用KMP或BM变体的循环,并将每个找到的事件转储到一个数组中,但这似乎不是最快的.
分而治之算法难道不是优越的吗?
例如,假设您在字符串"abbcacabbcabcacbccbabc"中查找序列"abc".
考虑到我提出这个想法的难易程度,我假设有人已经想出了它,并在30年前改进了它.
我正在尝试重构现有的Winform应用程序以使用MVP被动视图模式.应用程序的UI,业务逻辑和数据存储代码已经多年自由混合.看起来它要么是从单独的层开始,要么是有人试图将它分成层.在任何情况下都不尊重层边界.
由于表单直接操作域对象和数据源(反之亦然),我的第一个任务是创建演示者/控制器对象并委派这些职责.
该应用程序是一个.NET 1.1应用程序,我正在使用相当有限的重构加载项在VS.NET 2003中进行开发.我使用测试生成器为现有代码创建锅炉板单元测试然后经过并手动编辑每个测试.当然,这最终会测试代码的功能,而不一定是它所要做的.对于新课程,我正在做TDD.
任何提示,资源,陷阱需要通过这种规模的重构努力来寻找?
我已经拥有的一些资源:
更新:举个例子,你会采取什么步骤来解决这个问题:
private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
{
string LocalVariable;
decimal AnotherLocal;
if (!this._SomeDomainObject.SomeMethod(ClassField, out LocalVariable, out AnotherLocal))
{
MessageBox.Show("An error occurred calling method");
return;
}
this.FormControl.Value = LocalVariable;
this.AnotherFormContorl.Value = AnotherLocal;
this.AnotherPrivateMethod();
}
Run Code Online (Sandbox Code Playgroud)
进入:
private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
{
this.FormPresenter.DoSomething();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试行为驱动的开发,我发现自己在我写作时第二次猜测我的设计.这是我的第一个绿地项目,可能只是我缺乏经验.无论如何,这是我正在编写的类的简单规范.它是用BDD风格在NUnit中编写的,而不是使用专用的行为驱动框架.这是因为该项目的目标是.NET 2.0,所有的BDD框架似乎都采用了.NET 3.5.
[TestFixture]
public class WhenUserAddsAccount
{
private DynamicMock _mockMainView;
private IMainView _mainView;
private DynamicMock _mockAccountService;
private IAccountService _accountService;
private DynamicMock _mockAccount;
private IAccount _account;
[SetUp]
public void Setup()
{
_mockMainView = new DynamicMock(typeof(IMainView));
_mainView = (IMainView) _mockMainView.MockInstance;
_mockAccountService = new DynamicMock(typeof(IAccountService));
_accountService = (IAccountService) _mockAccountService.MockInstance;
_mockAccount = new DynamicMock(typeof(IAccount));
_account = (IAccount)_mockAccount.MockInstance;
}
[Test]
public void ShouldCreateNewAccount()
{
_mockAccountService.ExpectAndReturn("Create", _account);
MainPresenter mainPresenter = new MainPresenter(_mainView, _accountService);
mainPresenter.AddAccount();
_mockAccountService.Verify();
}
}
Run Code Online (Sandbox Code Playgroud)
MainPresenter使用的接口都没有任何实际的实现.AccountService将负责创建新帐户.可以将IAccount的多个实现定义为单独的插件.在运行时,如果有多个,则会提示用户选择要创建的帐户类型.否则AccountService将只创建一个帐户.
让我感到不安的一件事是,只需编写一个规范/测试就需要多少次模拟.这只是使用BDD的副作用还是我错误的方式?
[更新]
这是MainPresenter.AddAccount的当前实现
public void AddAccount()
{ …Run Code Online (Sandbox Code Playgroud) 我一直想知道工厂模式和存储库模式是否需要在域驱动设计项目中携手并进?
我问的原因是我这样做的方式是这样的:
GUI - > ClassFactory - > ClassProduct(在域模型中) - > ClassProductRepository - > Datasource
GUI调用ClassFactory将GUI与业务逻辑分开.ClassProduct调用ClassProductRepository以将业务逻辑与数据源分开.
将这些设计模式与域驱动设计一起使用是错误的方法吗?如果是,请说明您对此主题的意见.
我有两个Delphi运行时包.在SecondPackage包括FirstPackage它的requires条款.其中一位开发人员最近在第一个包中添加了几个新文件.
现在,当我编译第一个包时,我没有任何错误,但是当我编译第二个包时,我不断得到:
[DCC Fatal Error] FirstPackage.dpk(91): F1026 File not found: 'SomeFile.dcu'
Run Code Online (Sandbox Code Playgroud)
SomeFile已经包含FirstPackage但重新添加它以FirstPackage移动SomeFile到Contains子句的结尾并让我:
[DCC Fatal Error] FirstPackage.dpk(91): F1026 File not found: 'SomeOtherFile.dcu'
Run Code Online (Sandbox Code Playgroud)
我可以继续重新添加文件,直到我脸红了,结果总是一样的.编译contains时无法找到子句中的第一个文件SecondPackage.
我已经尝试手动删除所有相关的dcus,dcps和bpls并重建但无济于事.有任何想法吗?
我正在创建一个模拟用户输入(鼠标和键)的框架.
该框架将提供用于简单实现DUnit测试的API.
我目前面临的一个重大问题是等待应用程序空闲.
我有一个服务器(TCP)接收命令,如"类型文本","按键","单击XY"...我需要等待处理这些命令,然后返回到客户端API继续运行测试的下一步.
由于我的服务器通过线程接收并执行操作,因此不存在捕获执行的风险,就像单击将显示模式消息的按钮一样.
我目前正在使用ApplicationEvents.OnIdle来帮助我,但在某些情况下它不能很好地工作.
我也尝试使用WaitForInputIdle,但只是它没有解决我的问题,因为应用程序可能仍在处理用户输入后处理操作...
有人能帮我吗?
今天我偶然发现了导致我的阵列损坏的问题.这是一个可重现的测试用例:
unit Unit40;
interface
type
TVertex = record
X, Y: Double;
end;
TEdge = record
V1, V2: TVertex;
end;
TEdges = array of TEdge;
type
TBoundryInfo = array of TEdges;
procedure MemoryCorrupt;
implementation
procedure MemoryCorrupt;
var
BoundryInfo: TBoundryInfo;
i, PointIndex, BoundryLength: Integer;
begin
BoundryLength := 57;
PointIndex := 0;
SetLength(BoundryInfo, BoundryLength);
for i := 0 to BoundryLength - 1 do
begin
if i <> 17 then
begin
SetLength(BoundryInfo[i], 1);
BoundryInfo[i][0].V1.X := 1;
BoundryInfo[i][0].V2.X := 1;
BoundryInfo[i][0].V1.Y := 1;
BoundryInfo[i][0].V2.Y := …Run Code Online (Sandbox Code Playgroud) 我有一个dll导出一个返回接口的函数.
我为LoadLibrary,GetProcAddress和FreeLibrary函数创建了一个包装器,用于调用导出的函数.
TInterfaceGetter = class
private
...
public
constructor Create;
destructor Destroy; override;
function GetInterface: IMyInterface;
end;
Run Code Online (Sandbox Code Playgroud)
当第一次调用GetInterface时,这个包装器延迟加载dll并缓存模块句柄和导出函数的proc地址.对FreeLibrary的调用发生在包装器的析构函数中.
除非客户端代码在释放包装器后挂起到接口引用上,否则一切都会很好地工作.当接口引用最终超出作用域时,对_IntfClear的结果调用会引发访问冲突,因为dll以及它正在使用的任何内存已经从客户端的内存空间中卸载.
我怎样才能优雅地处理这件事?完整的COM实现如何处理这种情况?
我正在使用DDD技术编写应用程序.这是我第一次尝试DDD项目.这也是我的第一个绿地项目,我是唯一的开发商.我充实了域模型和用户界面.现在我开始使用持久层.像往常一样,我开始进行单元测试.
[Test]
public void ShouldAddEmployerToCollection()
{
var employerRepository = new EmployerRepository();
var employer = _mockery.NewMock<Employer>();
employerRepository.Add(employer);
_mockery.VerifyAllExpectationsHaveBeenMet();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我没有对Add()函数写任何期望.我做到了这一点,并意识到我还没有确定一个特定的数据库供应商.事实上,我甚至不确定它是否需要数据库引擎.平面文件或xml可能同样合理.所以我想知道我的下一步应该是什么.
我应该添加另一层抽象...说一个DataStore接口还是找一个已经为我完成工作的现有库?如果可以的话,我想避免将程序绑定到特定的数据库技术.
delphi ×5
c# ×3
abstraction ×1
algorithm ×1
bdd ×1
bold-delphi ×1
delphi-2009 ×1
mvp ×1
packages ×1
refactoring ×1
repository ×1
search ×1
unit-testing ×1
winforms ×1