Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中安全地将静态类转换为实例化类#_C#_.net_Architecture - Fatal编程技术网

C# 如何在C中安全地将静态类转换为实例化类#

C# 如何在C中安全地将静态类转换为实例化类#,c#,.net,architecture,C#,.net,Architecture,我最近(几个月前)换了工作,并且继承了一个代码库,它尽可能多次违反了每一条坚实的原则。似乎编写这段代码的人决定详细研究每一个好的编码实践,并尽可能经常和最彻底地违反它们 我是该产品的唯一开发人员-组织中没有人知道代码,代码库太大太复杂,无法完全重写。我正在寻找我能做出的最高价值的改变,以使代码库灵活和健壮。也不能放弃该产品 产品中所有问题的根源都来自一组类,这些类是核心业务逻辑数据结构。这些课程有很多问题,但我真正感兴趣的是: public static class NetCollection

我最近(几个月前)换了工作,并且继承了一个代码库,它尽可能多次违反了每一条坚实的原则。似乎编写这段代码的人决定详细研究每一个好的编码实践,并尽可能经常和最彻底地违反它们

我是该产品的唯一开发人员-组织中没有人知道代码,代码库太大太复杂,无法完全重写。我正在寻找我能做出的最高价值的改变,以使代码库灵活和健壮。也不能放弃该产品

产品中所有问题的根源都来自一组类,这些类是核心业务逻辑数据结构。这些课程有很多问题,但我真正感兴趣的是:

public static class NetCollection
{
    private static Logger LogFile { get { return Logger.GetMethodLogger(2); } }
    // Declare local variables.
    private static Dictionary<string, NetObject> netObjectHashTable;
    private static Dictionary<string, NetTitle> titlePropertyHashTable;
    private static Dictionary<string, NetObject> referenceDataHashTable;
    private static Dictionary<int, SortedDictionary<string, int>> picklistHashTable;

    public static IEnumerable<NetObject> NetObjects
    {
        get
        {
            return netObjectHashTable.Values;
        }
    }

    static NetCollection()
    {
        netObjectHashTable = new Dictionary<string, NetObject>();
        titlePropertyHashTable = new Dictionary<string, NetTitle>();
        referenceDataHashTable = new Dictionary<string, NetObject>();
        picklistHashTable = new Dictionary<int, SortedDictionary<string, int>>();
    }

    public static void AddNetObject(NetObject newObject)
    {
        if (newObject == null)
            return;
        if (newObject.TitleType == "Reference Data")
        {
            // Check if hash table contains key
            if (!referenceDataHashTable.ContainsKey(newObject.ID.ToString()))
            {
                referenceDataHashTable.Add(newObject.ID.ToString(), newObject);
            }
        }
        else
        {
            // Check if hash table contains key
            if (!netObjectHashTable.ContainsKey(newObject.ID.ToString()))
            {
                netObjectHashTable.Add(newObject.ID.ToString(), newObject);
            }
        }
    }
}
公共静态类NetCollection
{
私有静态记录器日志文件{get{return Logger.GetMethodLogger(2);}
//声明局部变量。
私有静态字典netObjectHashTable;
私有静态字典titlePropertyHashTable;
私有静态字典referenceDataHashTable;
私有静态字典picklistHashTable;
公共静态IEnumerable NetObjects
{
得到
{
返回netObjectHashTable.Values;
}
}
静态NetCollection()
{
netObjectHashTable=新字典();
titlePropertyHashTable=新字典();
referenceDataHashTable=新字典();
picklistHashTable=新字典();
}
公共静态void AddNetObject(NetObject newObject)
{
if(newObject==null)
返回;
if(newObject.TitleType==“参考数据”)
{
//检查哈希表是否包含密钥
如果(!referenceDataHashTable.ContainsKey(newObject.ID.ToString()))
{
referenceDataHashTable.Add(newObject.ID.ToString(),newObject);
}
}
其他的
{
//检查哈希表是否包含密钥
如果(!netObjectHashTable.ContainsKey(newObject.ID.ToString()))
{
netObjectHashTable.Add(newObject.ID.ToString(),newObject);
}
}
}
}
为了简洁起见,我从这个类中删除了很多其他方法

正如您所看到的,这个类有大量的问题(在静态类中存储状态是一种巨大的代码气味——围绕这个类编写整个应用程序简直是疯了)

我目前的意图是将这个类重构成一个合适的单例类(并最终重构成一个常规类,以便使用户能够同时打开多个文档)

我应该这样做吗


做出这种改变的最大风险是什么?我可以采取什么方法来降低进行此更改的风险?

能否将其包装为一个静态Factory类?作为一个单身汉,做你认为你需要的一切,并根据需要保持某些东西是静态的?它将解决一些问题,并为您提供一些灵活性。

是的,转换为单身似乎是很好的第一步。它仍然不会是线程安全的,但这只是一个开始。然后,您可以将它从一个真正的单例更改为一个允许构造单独实例的单例,但也有一个与单例相同的“默认”实例。(当然,您可以将“实例持有者”分离为一个单独的类。)这将允许您开始编写可测试代码,每次都从一个新实例开始

在此之后,您可以开始引入依赖项注入,以便需要访问同一实例的每个类都可以获得它。。。并删除“默认”实例

当然,如果可以减少需要访问同一实例的类的数量,那也会更好


对于线程,您需要锁定每个方法,或者使用
ConcurrentDictionary

静态类和单例类之间没有真正的区别。是的,它的实现方式是不同的,但您也有相同的问题(只是为了不使用-
静态的
我认为没有必要采取行动)


如果你能找到一个“真实”的实例,就去做吧。但是仅仅重构到Singleton,因为Lint不会抱怨,这不是一个好办法。

如果您不知道这种类型在应用程序中是如何流动的,那么这是一项危险的任务。但如果你真的需要在不破坏一切的情况下做到这一点,我想:

我知道我需要的是文档之间的一种独特划分,并且我知道(时间证明了这一点)这种类型适用于单个文档,让我们添加文档切片

让我们假设
文档
具有
名称
属性,我们可以考虑如下内容(示例):

将所有字段设置为非静态:

//没有静态
...
私有记录器日志文件{get{return Logger.GetMethodLogger(2);}
私有字典netObjectHashTable;
专用词典标题PropertyHashtable;
私有字典引用数据哈希表;
私有字典picklistHashTable;
把它们移到内部

private class NetDocument {
       public string DocumentName {get;set;} //DEFINE DOCUMENT IT RELATED TO !
       ...
       private Logger LogFile { get { return Logger.GetMethodLogger(2); } }   
       private Dictionary<string, NetObject> netObjectHashTable;
       ....

  }
私有类NetDocument{
公共字符串DocumentName{get;set;}//定义与其相关的文档!
...
私有记录器日志文件{get{return Logger.GetMethodLogger(2);}
私有字典netObjectHashTable;
....
}
因此,您可以在单个文档和与其相关的数据之间创建具体的隔离

进入主类后,您可以拥有:

public static class NetCollection
{
    ... 

    //Key: document name
    //Value: NetDocument data
    private Dictionary<string, NetDocument> documents = new ....
}
公共静态类NetCollection
{
... 
//关键字:文件名
//值:NetDocument数据
私有字典文档=新建。。。。
}
这个
private class NetDocument {
       public string DocumentName {get;set;} //DEFINE DOCUMENT IT RELATED TO !
       ...
       private Logger LogFile { get { return Logger.GetMethodLogger(2); } }   
       private Dictionary<string, NetObject> netObjectHashTable;
       ....

  }
public static class NetCollection
{
    ... 

    //Key: document name
    //Value: NetDocument data
    private Dictionary<string, NetDocument> documents = new ....
}