相关疑难解决方法(0)

如何避免API设计中的"参数太多"问题?

我有这个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)

c# immutability data-structures

157
推荐指数
7
解决办法
3万
查看次数

工厂与实例构造函数

我想不出为什么一个比另一个更好的原因.比较这两个实现:

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框架中有一些地方使用静态方法来创建实例.起初我在考虑,它注册它的实例来跟踪它们,但是常规构造函数可以通过使用私有静态变量来做同样的事情.

这种风格背后的原因是什么?

c# oop constructor coding-style

39
推荐指数
4
解决办法
2万
查看次数

使用 2 个非默认构造函数反序列化类

我有一个类,它尝试序列化和反序列化给它的对象,使用 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)

c# json

6
推荐指数
2
解决办法
1万
查看次数

HashTable问题

我有一个有趣的问题需要使用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)

任何解释都会很棒!

java hashtable java1.4 java-me

6
推荐指数
1
解决办法
2031
查看次数