当你在一个类上有一个空的构造函数时,使用Rhino Mocks模拟一个具体的类似乎很容易:
public class MyClass{
public MyClass() {}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我添加一个带参数的构造函数并删除不带参数的构造函数:
public class MyClass{
public MyClass(MyOtherClass instance) {}
}
Run Code Online (Sandbox Code Playgroud)
我倾向于得到一个例外:
System.MissingMethodException:找不到具有匹配参数的构造函数
我已经尝试在我对Mock或Stub的调用中输入空值,但它不起作用.
我可以创建缺少无参数构造函数的具体类的模拟和存根吗?
我在一些DDD企业应用程序中看到的一件事是,使用与域实体相同的接口,以及属性和功能的一对一映射.实际上,域对象总是通过它的一对一接口使用,并且所有域实体都具有这种风格的一对一接口.
例如:
域对象帐户:
public class Account : IAccount
{
public string Name {get;set;}
//...some more fields that are also in IAccount
public decimal Balance {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
它是匹配的界面
public interface IAccount
{
string Name {get;set;}
//... all the fields in Account
decimal Balance {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
但最近我越来越相信这实际上是一种反模式.
我是由开源社区的一些架构师运行的,他们说这是基于设计错误或缺陷,在设计链的某个地方.
所以我告诉我的同事他们应该退出为Domain对象创建接口.因为它们没有任何意义,所以每当更新域实体时都必须更新接口.
首先声称这些接口提供了"解耦",但我反驳说,因为接口与域实体有一对一的关系,它们实际上并没有提供任何解耦,接口的改变意味着改变域实体,反之亦然.
下一个主张是我们需要接口用于测试目的.我的反击是Rhino-mocks提供了具体类的模拟和存根.但是他们声称Rhino-mocks在具体课程方面遇到了麻烦.我不知道我是否购买,即使rhino-mocks在具体类中遇到问题,也不一定意味着我们应该使用域实体的接口.
所以我很好奇:
为什么你的域实体有一对一的接口?
为什么不?
为什么这是一个好的或坏的做法?
谢谢阅读!
编辑:我应该注意,我一直使用接口,我相信如果它被要求我将使用一个接口.但我特别指的是具有一对一接口的域实体.
在SRP中,"责任"通常被描述为"改变的理由",因此每个类(或对象?)应该只有一个人应该去那里并改变它的原因.
但是,如果你把它变成极端细粒度,你可以说一个对象将两个数字加在一起是一个责任,也是一个可能的改变原因.因此,对象不应包含其他逻辑,因为它会产生另一个改变的原因.
我很好奇是否有人有任何"范围"策略,单一责任原则稍微不那么客观?
javascript的一个很难找到信息的方面是套管实践.通过套管实践,我的意思是套管样式(即驼峰式,pascal-case等)应该用于哪些元素(构造函数,私有函数,公共函数).
我听过的唯一一条规则是关于YUI剧院的Douglas Crockford演讲,指出构造函数应该是唯一以大写字母开头的函数.
除此之外,人们在javascript中似乎没有很多套管标准.
有没有人知道javascript的任何套管最佳做法,以及为什么使用它们是合理的?
你也遵循.js文件的套管风格吗?
我有一个类Post是实体框架模型.它包含这样的属性:
public bool Showable {
get {
return this.Public && this.PublishedDate > DateTime.now
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在这样的查询中使用它:
from p in db.Posts where p.Showable select p;
Run Code Online (Sandbox Code Playgroud)
但是当我有一个使用它的属性时,就像这样
public IEnumerable<Post> ShowablePosts {
get {
return from p in db.Posts where p.Showable select p;
}
}
Run Code Online (Sandbox Code Playgroud)
那我不能做:
from p in ShowablePosts where p.Id > 42 select p;
Run Code Online (Sandbox Code Playgroud)
它说:
LINQ to Entities不支持指定的类型成员"Showable".仅支持初始值设定项,实体成员和实体导航属性.
除了因为会话存储是多个页面的会话全局,你为什么要使用viewstate来保存值?
从客户端到服务器之间来回发送除了一些小的查询字符串之外的任何类型的信息似乎有点荒谬.我的意思是浪费带宽(!),仅用于存储目的.该会话虽然跨越多个页面,但看起来像是一个完全优于视图状态的替代方案.
特别是对于asp.net ajax控件和变体,viewstate可能很快变得臃肿,跟踪所有这些不同控件和html元素的各种状态和变量.
但那么为什么页面变量和对象的视图存储呢?
也许我错过了该页面的viewstate存储的另一个很好的用法,有没有人知道那里的东西?
谢谢阅读!
编辑:每个人都有一个很好的答案,对不起,如果我没有选择你的.
我试图找出命名和包装css类和id的最佳实践,特别是多个单词名称.
例如,假设我有一个<div>我想要命名的"角色技能".似乎有3种选择:"characterskills","character_skills"或"character-skills".
其中哪一个是命名css类和id的行业标准?
在css名称中拆分多个单词的最佳做法是什么?
最好的做法是始终使用全部小写的css名称,因为它们不区分大小写?
在Grails中,flash存储对象用于保存交叉请求数据,如消息.
我知道它可以从大多数视图和控制器访问,但我不确定它是否可以在Grails中普遍使用,或者它是否只能从某些传统对象访问.
例如,可以flash从中访问对象Services吗?
甚至在实时网络请求期间的任何地方?
在访问方面有什么限制?
在许多领先的DDD项目中,特别是MVC样式,我看到UI使用镜像域实体的显示对象,而不是直接使用这些域对象.这种风格显然是为了解决和分离问题,我个人更喜欢这种风格.
但我不确定的是,这是否是DDD的严格原则,还是这不仅仅是开发人员对它的不同解释.
您是否可以直接在UI中使用域对象,并且仍然遵循该行为中的DDD方法?
或者,总是使用显示对象是DDD最佳实践吗?
注意:当我提到MVC时,我真的很感兴趣是否必须在DDD项目中的几乎所有DDD兼容的UI模式中使用显示对象.
c# ×2
.net ×1
asp.net ×1
casing ×1
constructor ×1
css ×1
dns ×1
function ×1
grails ×1
html ×1
html-select ×1
interface ×1
javascript ×1
oop ×1
rhino-mocks ×1
single-responsibility-principle ×1
storage ×1
tdd ×1
variables ×1
viewstate ×1