使用局部类是一种好的做法/设计吗?

时间:2019-06-07 05:39:07

标签: c# design-patterns

您能否说将一个类拆分为部分类是封装代码的一种方法?

此外,为什么将代码拆分为部分类却不是设计模式的一部分?我的意思是说您是通过拆分代码来进行更好的概述来设计代码的,对吧?

General.cs:

public partial class LevelParser {
    public Dictionary<string, Tuple<int, char, string, int, int, Entity>>
        GetCustomerInfo(string[] txtFile) {

        // Creates a dictionary containing all info about the customer
        var retDict = new Dictionary<string, Tuple<int, char, string, int, int, Entity>>();

        // Iterates over the entire txtFile and finds certain string
        IEnumerable<string> findName = txtFile.Where(l => l.StartsWith("Customer: "));
        foreach (var line in findName)
        {
            // Parses file
            var name = line.Split(' ')[1];
            var timeBeforeSpawn = Convert.ToInt32(line.Split(' ')[2]); // seconds
            var spawnOnPlatform = Convert.ToChar(line.Split(' ')[3]);
            var destinationPlat = line.Split(' ')[4]; // string
            var patienceTime = Convert.ToInt32(line.Split(' ')[5]); // seconds
            var rewardPoints = Convert.ToInt32(line.Split(' ')[6]);

            // Adds an entity
            var shape = new DynamicShape(new Vec2F(), new Vec2F());
            var image = new Image(Path.Combine("Assets", "Images", "CustomerStandLeft.png"));
            var entity = new Entity(shape, image);

            retDict.Add(name, new Tuple<int, char, string, int, int, Entity>(timeBeforeSpawn,
                spawnOnPlatform, destinationPlat, patienceTime, rewardPoints, entity));

        }

        // Now we have everything we need in one dictionary
        return retDict;
    }
}

ParseCustomer.cs:

{{1}}

还有3个文件,每个文件包含相同的部分类,但是文件的方法与其他文件有所不同。

4 个答案:

答案 0 :(得分:3)

这个世界中的部分类角色是代码生成器 Designers 的角色。另外,作为开发人员,您可以利用扩展类的优势而不会弄乱生成的代码

但是,它们在此之外的用途是有限的,并且相当可疑。

对于设计模式设计模式通常是可重复使用的解决方案,用于解决软件设计中给定上下文中的常见问题。是局部类的设计模式吗? hrmm,不是真的,就像C#中的扩展方法一样。

它们都是一点语法糖,它们还是被编译为一个类。

例如

java.text.ParseException: Unparseable date: "Wed Dec 02 00:00:00 ICT 2015"

this的形式生成

public partial class Test
{
    public int testing1 {get;set;}
}

public partial class Test
{    
    public int testing2 {get;set;}
}

答案 1 :(得分:1)

partial class是将类的定义拆分为多个文件的简单方法。

它不是设计模式的一部分,因为与单个文件中定义的“常规” class相比,它对class的功能没有实际影响。

答案 2 :(得分:1)

  

您可以说将一个类拆分为部分类是封装代码的一种方法吗?

Encapsulation是指一种将数据与对数据进行操作的方法(或其他功能)捆绑在一起的机制,从而限制了对对象某些组件的直接访问。

部分类提供了一种特殊功能,可以将单个类的功能实现为多个文件,并且在编译应用程序时将所有这些文件组合为单个类文件。

因此,局部类负责代码在文件中的物理分布,而封装则负责数据的逻辑分组和分类以及处理该数据的行为。

  

为什么将代码拆分为部分类而不是设计模式的一部分?

设计模式旨在为常见的重复出现的软件设计问题提供可重用的解决方案。这些模式在逻辑级别上工作,以提供创建对象,定义其结构或与符合SOLID principles的其他实体的行为的解决方案。

当我们将一个类拆分为多个文件时,我们并未对该类进行任何逻辑更改,从而不会影响其与其他任何类的关系。因此,部分类不被视为设计模式。

答案 3 :(得分:0)

部分类仍然是单个类,但分布在多个文件中。部分类的用户没有意识到该类是部分类的事实。另一方面,封装将引入更多的类。封装是设计级别的结构设计原则,而部分类是编译器级别的编译器或链接器概念。

模式必须对代码的结构,行为或体系结构的设计产生影响,才能将其视为设计模式。通常,设计模式分为创造,结构,建筑和行为设计模式。局部类的概念不属于这些类别。部分类的概念取决于编译器或链接器才能知道。

什么使图案成为图案?模式是在不同场景下如何做事或如何实现相同目标(解决相同问题)的模板。模式独立于编译器平台,因为它是一种独立于语言的通用解决方案。

引入C#语言的局部类提供了一种将UI标记代码(XAML)与相应的背后代码(C#)分开的方法。然后,编译器将合并两个文件。第一步,XAML解释器将XAML代码转换为C#。然后将两个部分类合并,然后再转换为IL。