我有这个API函数:
public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d,
string e, string f, out Guid code)
Run Code Online (Sandbox Code Playgroud)
我不喜欢它.因为参数顺序变得不必要的重要.添加新字段变得更加困难.很难看到传递的是什么.将方法重构为较小的部分更加困难,因为它会产生另一个传递子函数中所有参数的开销.代码更难阅读.
我提出了一个最明显的想法:让一个对象封装数据并传递它,而不是逐个传递每个参数.这是我想出的:
public class DoSomeActionParameters
{
public string A;
public string B;
public DateTime C;
public OtherEnum D;
public string E;
public string F;
}
Run Code Online (Sandbox Code Playgroud)
这减少了我的API声明:
public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out Guid code)
Run Code Online (Sandbox Code Playgroud)
尼斯.看起来很无辜,但我们实际上引入了一个巨大的变化:我们引入了可变性.因为我们以前一直在做的事实上是传递一个匿名的不可变对象:堆栈上的函数参数.现在我们创建了一个非常可变的新类.我们创建了操纵调用者状态的能力.太糟糕了.现在我希望我的对象不可变,我该怎么办?
public class DoSomeActionParameters
{
public string A { get; private set; }
public string B { get; private set; }
public DateTime C { get; private …
Run Code Online (Sandbox Code Playgroud) 我想不出为什么一个比另一个更好的原因.比较这两个实现:
public class MyClass
{
public MyClass(string fileName)
{
// some code...
}
}
Run Code Online (Sandbox Code Playgroud)
而不是:
public class MyClass
{
private MyClass(){}
public static MyClass Create(string fileName)
{
// some code...
}
}
Run Code Online (Sandbox Code Playgroud)
.Net框架中有一些地方使用静态方法来创建实例.起初我在考虑,它注册它的实例来跟踪它们,但是常规构造函数可以通过使用私有静态变量来做同样的事情.
这种风格背后的原因是什么?
我有一个类,它尝试序列化和反序列化给它的对象,使用 Json.net
public class JsonSerializer
{
public string Serialize(object toSerialaze)
{
return JsonConvert.SerializeObject(toSerialaze);
}
public T Deserialize<T>(string toDeserialaze)
{
return JsonConvert.DeserializeObject<T>(toDeserialaze);
}
}
Run Code Online (Sandbox Code Playgroud)
并给它一个这样的类的对象
public class Isbn
{
private readonly int _groupCode;
private readonly int _publisherCode;
private readonly int _titleCode;
private readonly int _checkCode;
private static readonly Regex Regex = new Regex(@"^\s*\d*\s*-\s*\d*\s*-\s*\d*\s*-\s*\d*\s*$");
public Isbn(int groupCode, int publisherCode, int titleCode, int checkCode)
{
_groupCode = groupCode;
_publisherCode = publisherCode;
_titleCode = titleCode;
_checkCode = checkCode;
}
public Isbn(string isbn)
{
if …
Run Code Online (Sandbox Code Playgroud) 我有一个有趣的问题需要使用Hashtables
; 我正在为S40诺基亚开发(合规级别为1.4)
我希望如何Hashtable
工作:
Hashtable table = new Hashtable();
table.put(1, "Hello World");
Run Code Online (Sandbox Code Playgroud)
但是我得到错误:
put(Object, Object)
类型中的方法Hashtable
不适用于参数(int, String)
但是,当我创建一个对象引用并传递引用时,它工作正常!为什么?!
工作范例:
Hashtable table = new Hashtable();
Integer test = new Integer(1);
table.put(test, "Hello World");
Run Code Online (Sandbox Code Playgroud)
任何解释都会很棒!
c# ×3
coding-style ×1
constructor ×1
hashtable ×1
immutability ×1
java ×1
java-me ×1
java1.4 ×1
json ×1
oop ×1