我有一个模拟对象作为构造函数参数传递给另一个对象.
如何测试已调用模拟对象的属性?这是我目前使用的代码:
INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });
Run Code Online (Sandbox Code Playgroud)
这有效,除非在"someobject"中,Forenames属性的getter被多次使用.那时我得到"Rhino.Mocks.Exceptions.ExpectationViolationException:INewContactAttributes.get_Forenames();期望#1,实际#2 .."
简单地使用
newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());
Run Code Online (Sandbox Code Playgroud)
不起作用,并给出以下错误:
"期望已从等待期望列表中删除,您是否调用了Repeat.Any()?AssertWasCalled()不支持这种情况."
那么我该如何迎合多次通话呢?
Allen Holub写了以下内容,
如果没有一些耦合,你就无法拥有一个程序.尽管如此,您可以通过盲目地遵循OO(面向对象的)规则来最大限度地减少耦合(最重要的是对象的实现应该完全隐藏在使用它的对象之外).例如,对象的实例变量(非常量的成员字段)应始终为私有.期.没有例外.永远.我是认真的.(您可以偶尔有效地使用受保护的方法,但受保护的实例变量是令人厌恶的.)
这听起来很合理,但他继续说,
你不应该出于同样的原因使用get/set函数 - 它们只是过于复杂的方式使字段公开(尽管返回完整对象而不是基本类型值的访问函数在返回对象的情况下是合理的class是设计中的关键抽象).
坦率地说,这对我来说听起来很疯狂.
我理解信息隐藏的原理,但是如果没有访问器和更改器,你根本就不能使用Java bean.我不知道如何在模型中没有访问器的情况下遵循MVC设计,因为模型不能负责渲染视图.
但是,我是一名年轻的程序员,而且我每天都在学习更多关于面向对象设计的知识.也许拥有更多经验的人可以在这个问题上权衡.
长话短说:我的情况是我喜欢PHP式的getter,但是在JavaScript中.
我的JavaScript只在Firefox中运行,因此我可以使用Mozilla特定的JS.
我可以找到制作JS getter的唯一方法是需要指定它的名称,但是我想为所有可能的名称定义一个getter .我不确定这是否可行,但我非常想知道.
我如何使用set和get方法,为什么要使用它们?他们真的很有帮助吗?你也可以给我一些set和get方法的例子吗?
我正在尝试创建一个使用getter定义属性的抽象类.我想将它留给派生类来决定是否要为属性实现setter.这可能吗?
到目前为止我所拥有的:
public abstract class AbstractClass {
public abstract string Value { get; }
public void DoSomething() {
Console.WriteLine(Value);
}
}
public class ConcreteClass1 : AbstractClass {
public override string Value { get; set; }
}
public class ConcreteClass2 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public string Value {
set { _value = value; }
}
}
public class ConcreteClass3 : AbstractClass {
private string _value;
public override string …Run Code Online (Sandbox Code Playgroud) C++ getter方法的最佳实践是什么,它应该返回一个非平凡类型,但是类型为class或struct的成员.
MyType MyClass::getMyType() { return mMyType; } const MyType& MyClass::getMyType() { return mMyType; } MyType* MyClass::getMyType() { return &mMyType; } 哪里
class MyType { /* ... */ };
class MyClass
{
private:
MyType mMyType;
}
Run Code Online (Sandbox Code Playgroud)
我特别担心这种方法的以下用法.你能否详细说明这可能会如何影响复制对象,以及悬挂引用和疯狂指针的危险,如果function()想保存它以供进一步使用.
MyType* savedPointer;
SomeType function(MyType* pointer) { savedPointer = pointer; };
Run Code Online (Sandbox Code Playgroud)
一个.有效期为1和2.
{
MyType t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
Run Code Online (Sandbox Code Playgroud)
湾 有效期为1和2.
{
const MyType& t = myClass.getMyType();
function(&t);
}
// is savedPointer still …Run Code Online (Sandbox Code Playgroud) 为什么Java方法名称如此广泛地使用"get"前缀?至少在我的Java程序也有很多与以单词"获取"名称的方法.get方法的百分比非常高.由于通货膨胀,我开始觉得"获得"这个词正在失去意义.这是我的代码中的噪音.
我注意到,有功能性/声明性编程和PL/SQL中使用不同的命名约定.方法名称只是说明方法返回的内容.而不是account.getAmount()或Time.getIsoFormattedDateString(Date date)他们将使用account.amount()和Time.isoFormattedDateString(Date date).这让我感觉良好,因为该函数的名称描述评估方法(假设有没有副作用,这不应该是这样)的结果."get"前缀似乎是多余的.
我刚刚开始阅读"清洁代码"一书.它说方法应该只做一件事,那件事通常应该是以下之一:
我的问题是关于第三类.对于这种方法,是否存在除"get"之外的命名约定?选择方法名称/前缀时使用什么标准?
这是一个例子:
我有两个方法的类getDates()和getSpecialDates().getDates()只返回私有变量的值(对日期集合的引用).据我所知,这是一个标准的吸气剂.getSpecialDates()是不同的; 它调用getDates(),从另一个类中获取过滤器,应用过滤器并返回实际上是其子集的过滤器getDates().
该方法getSpecialDates()可以被命名为computeSpecialDates(),findSpecialDates(),selectSpecialDates()或elicitSpecialDates()或什么的.或者我可以简单地命名它specialDates().然后,为了保持一致性,我可以重新命名getDates()成dates().
为什么要分开应该以"get"为前缀的方法和不应该使用的方法,以及为什么要为"get"找到替换词呢?
我喜欢Lombok项目,但最近我正在阅读并尝试 Java 14 的一些新功能。
在新功能中,有一个record关键字,它允许创建一个已经内置以下功能的类:构造函数、私有 final 字段、访问器、equals/hashCode、getter、toString 方法。
现在我的问题是:是更好地依赖 Lombok 的功能还是应该开始使用记录功能:
最好使用这个:
record Person (String name, String surname) {}
Run Code Online (Sandbox Code Playgroud)
或者那个:
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Person {
@Getter private int name;
@Getter private int surname;
}
Run Code Online (Sandbox Code Playgroud)
这两种方法的优缺点是什么?
人们如何看待在界面中使用的最佳指南?什么应该和不应该进入界面?
我听说有人说,作为一般规则,接口必须只定义行为而不是状态.这是否意味着接口不应包含getter和setter?
我的观点:对于制定者来说可能不是这样,但有时我认为吸气剂可以放在界面中.这仅仅是为了强制实现类来实现那些getter,以便表明客户端能够调用那些getter来检查某些东西,例如.
最好的解释方法是举例如下:
这是模型
public class Person
{
public int age;
public string name;
}
Run Code Online (Sandbox Code Playgroud)
这是视图模型
public class PersonVM
{
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
vm应该将人员暴露给数据模板还是用他自己的属性封装模型属性?
getter ×10
java ×4
setter ×4
c# ×3
properties ×2
c++ ×1
firefox ×1
immutability ×1
interface ×1
java-14 ×1
java-record ×1
javabeans ×1
javascript ×1
lombok ×1
many-to-many ×1
methods ×1
mvvm ×1
oop ×1
rhino-mocks ×1
unit-testing ×1