我在php工作,接口的概念在我看来有点无用.从阅读中,我理解接口是"按合同设计"的一部分,但至少不保证某类特定类型的返回,实际上没有任何合同.这似乎是一份合同,上面写着"我们同意做以下事情:''" - 没有协议的条款.
如果我想保证一个对象有一个方法,那么接口似乎并不特别有用.如果我尝试调用一个对象没有的方法,我会得到一个致命错误,所以我很快发现该类没有一个具有该名称的方法.如果我想要聪明并事先检查一个类是否有方法,那么检查接口,并查看对象是否实现了该接口似乎不再节省我的时间,而不仅仅是直接检查该对象(我会这样做)无论如何,无论它做了什么接口或没有实现任何接口,该类都有该方法.
换句话说,仅仅因为我有一组具有特定名称的方法,这并不能保证我有任何特定的行为.如果我保证返回某个类型的变量,我至少会对输出的内容有所了解,并且我可以编写使用该接口的对象的代码,因为我知道我得到的是什么它的.如果它返回一个字符串,我可以继续编码至少确定我之后正在处理字符串输出.所以当指定返回类型时,我保证至少有一些行为.是保证行为的一部分是什么接口,或不是?
我唯一能想到的是,当我编写代码时,它会作为一个便利贴给自己,以确保在以后编写该类时创建某些方法.当我编写代码时,它似乎更像是脚手架; 当我实际使用它时,我没有看到太多的好处.因此,在我创建类时,保持标准比在编写类时要多得多.这种好处似乎并没有真正体现在合同设计的概念中.
在动态/松散类型的语言(如PHP)中使用接口实际获得了哪些好处?它们是伟大的,还是更强大的OO语言实现的东西,所以PHP也实现了它?
这是我正在参加的java课程.该书提到了先决条件和后置条件,但没有给出任何如何编码它们的例子.它继续讨论断言,我把它断了下来,但我正在做的赋值具体说明插入前置条件并用断言测试前置条件.
任何帮助都会很棒.
这里有人经常使用Spec#吗?在我开始使用它之前,我想知道它是否足够稳定和强大.看起来语法正在影响c#4.0,这有望在4.0发布后更容易升级.思考?
我正在阅读示例代码ListAdder,并且在变量之后有很多断言,或者几乎在每个方法中使用,例如:
self.formatter = [[[NSNumberFormatter alloc] init] autorelease];
assert(self.formatter != nil);
要么 :
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
#pragma unused(tv)
#pragma unused(indexPath)
UITableViewCell * cell;
assert(tv == self.tableView);
assert(indexPath != NULL);
assert(indexPath.section < kListAdderSectionIndexCount);
assert(indexPath.row < ((indexPath.section == kListAdderSectionIndexNumbers) ? [self.numbers count] : 1));
Run Code Online (Sandbox Code Playgroud)
我在想,有什么意义呢?
谢谢
去年我参加了一个关于设计合同方法的课程.我们使用Mircosoft Research创建的Contract API在C#中编程,并使用PEX生成单元测试.今年,我正在用xcode编写iphone应用程序.我想知道是否存在允许我使用Design By Contract的库,以及一个生成与PEX相似的单元测试的工具,适用于Objective-C.我真的很想能够制定不变量,后置和先决条件.
您对Objective-C中的合同设计有任何实践经验吗?您想分享哪些建议?
我正在学习如何编程,但我无法理解的一件事是 preconditions 和postconditions。
调用函数之前的 if 语句是否被视为前提条件,或者在大多数语言中是否有单独的更有效的方法?
我也在努力寻找任何我可以用我目前的编程知识理解的先决条件的例子,如果有人能证明一个简单的例子,那么我真的很感激(任何语言都可以)
programming-languages design-by-contract preconditions post-conditions
它被列为除了Eiffel和Spec#之外的维基百科上具有本机DbC支持的语言,但我在文档或测试套件中找不到任何提及.
我在很多地方读到,DDD 中的一项重要要求是为存储库制定有限制的合同:
findByName(string name)
findByEmail(string email)
etc.
Run Code Online (Sandbox Code Playgroud)
并且不提供通用的查询接口:
findBySpecification(Specification spec)
Run Code Online (Sandbox Code Playgroud)
我确实理解为什么这很重要:能够模拟存储库进行测试,或更改底层的持久性框架。
虽然在整个应用程序中执行此规则并不难,但在为用户提供“高级搜索”表单时,我不知道如何执行它。
假设我有一个表单,允许按关键字、按日期、按作者等搜索博客文章。
这些标准可以自由组合,我显然无法为每个用例提供一种方法:
findByKeyword(string keyword)
findByDateRange(Date from, Date to)
findByKeywordAndDateRange(string keyword, Date from, Date to)
findByDateRangeAndAuthor(Date from, Date to, User author)
etc.
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了什么或者它是规则的例外之一?
orm domain-driven-design design-by-contract repository ddd-repositories
我最近对 DBC 方法产生了兴趣。由于 Java 是我的“本机”语言,我查看了cofoja和最近的java-on-contracts。我主要创建Android软件,所以我自然希望能够在我的手机上使用合同。
这两个项目都需要使用类似的东西
java -javaagent:path/to/cofoja-<version>.jar <someclass>
Run Code Online (Sandbox Code Playgroud)
作为JVM参数。是否可以使用此 JVM 参数在手机上启动 apk?dalvik 甚至支持这种参数吗?
我怎么能通过这个参数来启动一个应用程序?我不知道如何开始。也许通过蚂蚁脚本?
我对这种Design by Contract方法很感兴趣.似乎preconditions必须使用已检查的异常来强制执行它们.
但是post-conditions,class-invariants我认为这assertions是首选.
我对吗?如果我是正确的,为什么允许post-conditions和class-invariants禁用可能被禁用的断言?不应该强制执行后置条件和不变量吗?