C# 逻辑绑定的类属性的正确OOP实践

C# 逻辑绑定的类属性的正确OOP实践,c#,oop,class,design-patterns,properties,C#,Oop,Class,Design Patterns,Properties,我有一个名为“documentsection”的类,该类定义了文档的一部分,该部分稍后将以HTML格式组装。其中有一些属性,哪些值是必需的(或有效的)取决于彼此。例如: a) 有一个名为“section type”的枚举,可以是“view”(在本例中,另一个名为“content”的属性包含要读取的文件的路径/文件名)。也可以是“文本”,其中“内容”属性文本本身放置在文档中 b) 还有另一个名为“Action”的枚举,其类型可以是“append”、“prepend”或“replacebytag”。

我有一个名为“documentsection”的类,该类定义了文档的一部分,该部分稍后将以HTML格式组装。其中有一些属性,哪些值是必需的(或有效的)取决于彼此。例如:

a) 有一个名为“section type”的枚举,可以是“view”(在本例中,另一个名为“content”的属性包含要读取的文件的路径/文件名)。也可以是“文本”,其中“内容”属性文本本身放置在文档中

b) 还有另一个名为“Action”的枚举,其类型可以是“append”、“prepend”或“replacebytag”。在最后一种情况下,另一个属性变得相关,称为“tagtoreplace”。如果要追加/前置,则此tagtoreplace属性可以为空

表示这种相互依赖性的最佳实践方式是什么?我可以想出几种方法,但没有一种方法散发出美丽的气息:

  • 调用“生成文档”的方法时,检查属性以确保它们符合此逻辑

  • 在get/set方法中进行检查。这样做的一个问题是,当我将节类型设置为“查看”时,我可能要等到一行左右之后才能设置“内容”属性,因此您不能拒绝在该点设置它的请求

  • 以某种方式使用单独的属性来划分用途——在我上面的第一个示例中,例如“content”在一种情况下不应用于文件路径,在另一种情况下不应用于一组HTML内容。这对我来说味道不太好,但对每一个都有单独的属性似乎太过分了

  • 继承子类,每个子类都有不同的附加属性集。由于节类型和动作类型可以有多种组合,我想不出一种优雅的方法来将所有这些逻辑烘焙到这样的结构中。但我不是OOP大师

对最好的方法有什么想法吗


谢谢

设置属性不应对其他属性产生副作用


如果要执行类似操作,则应使用一种方法立即设置所有内容。

设置属性不应对其他属性产生副作用


如果要执行类似操作,则应使用一种方法立即设置所有内容。

如果属性用于文件路径,则它就是用于此目的的。如果它是为了内容,那就是它的目的。当一个属性可以表示两个不同的事物时,必然会出现混淆和错误


我认为您需要子类。将属性作为管理类创建的一种方式来查看。

如果属性是用于文件路径的,那么它就是用于文件路径的。如果它是为了内容,那就是它的目的。当一个属性可以表示两个不同的事物时,必然会出现混淆和错误


我认为您需要子类。请看一看作为管理类创建的一种方法。

我将采用以下方法:

interface ISection 
{
    void Render(); // or String Render() if you want to return a string
}

class ViewSection : ISection
{
    public String Filename { get; set; }

    public void Render()
    {
        // do stuff with Filename and/or return the content of the file
    }
}

class TextSection : ISection
{
    public String Text { get; set; }

    public void Render()
    {
        // do stuff with Text and/or return it
    }
}

class DocumentSection
{
    ISection _section;

    public void Render()
    {
        _section.Render();
    }
}

然后,您可以轻松地创建实现
ISection
的新类,这些类提供了额外的部分。“操作”也是如此,使用一种调用的
Render
PerformAction
方法定义一个
IAction
接口

我将采用以下方法:

interface ISection 
{
    void Render(); // or String Render() if you want to return a string
}

class ViewSection : ISection
{
    public String Filename { get; set; }

    public void Render()
    {
        // do stuff with Filename and/or return the content of the file
    }
}

class TextSection : ISection
{
    public String Text { get; set; }

    public void Render()
    {
        // do stuff with Text and/or return it
    }
}

class DocumentSection
{
    ISection _section;

    public void Render()
    {
        _section.Render();
    }
}

然后,您可以轻松地创建实现
ISection
的新类,这些类提供了额外的部分。“操作”也是如此,使用一种调用的
Render
PerformAction
方法定义一个
IAction
接口

我将HTML生成与文档生成本身分开。使用类定义文档,然后使用其他类生成文档的每个部分。通过这样做,您可以在以后轻松地添加新格式(或者更轻松地创建测试文档或生成html)

a) 有一个名为“section type”的枚举,可以是“view”(在本例中,另一个名为“content”的属性包含要读取的文件的路径/文件名)。也可以是“文本”,其中“内容”属性文本本身放置在文档中

类型属性通常是一种设计风格。 为每种类型的节派生一个
类。然后只需添加正确的派生类

b) 还有另一个名为“Action”的枚举,其类型可以是“append”、“prepend”或“replacebytag”。在最后一种情况下,另一个属性变得相关,称为“tagtoreplace”。如果要追加/前置,则此tagtoreplace属性可以为空


我不清楚如何使用action属性。

我将HTML生成与文档生成本身分开。使用类定义文档,然后使用其他类生成文档的每个部分。通过这样做,您可以在以后轻松地添加新格式(或者更轻松地创建测试文档或生成html)

a) 有一个名为“section type”的枚举,可以是“view”(在本例中,另一个名为“content”的属性包含要读取的文件的路径/文件名)。也可以是“文本”,其中“内容”属性文本本身放置在文档中

类型属性通常是一种设计风格。 为每种类型的节派生一个
类。然后只需添加正确的派生类

b) 还有另一个名为“Action”的枚举,其类型可以是“append”、“prepend”或“replacebytag”。在最后一种情况下,另一个属性变得相关,称为“tagtoreplace”。如果要追加/前置,则此tagtoreplace属性可以为空


我不清楚如何使用action属性。

我认为拥有一个属性的意义取决于另一个属性并不合适。我同意-问题是,实现上述a)和b)中的功能/要求的最佳实践方式是什么?我认为拥有一个属性的意义取决于