C# 逻辑绑定的类属性的正确OOP实践
我有一个名为“documentsection”的类,该类定义了文档的一部分,该部分稍后将以HTML格式组装。其中有一些属性,哪些值是必需的(或有效的)取决于彼此。例如: a) 有一个名为“section type”的枚举,可以是“view”(在本例中,另一个名为“content”的属性包含要读取的文件的路径/文件名)。也可以是“文本”,其中“内容”属性文本本身放置在文档中 b) 还有另一个名为“Action”的枚举,其类型可以是“append”、“prepend”或“replacebytag”。在最后一种情况下,另一个属性变得相关,称为“tagtoreplace”。如果要追加/前置,则此tagtoreplace属性可以为空 表示这种相互依赖性的最佳实践方式是什么?我可以想出几种方法,但没有一种方法散发出美丽的气息: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”。
- 调用“生成文档”的方法时,检查属性以确保它们符合此逻辑
- 在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)中的功能/要求的最佳实践方式是什么?我认为拥有一个属性的意义取决于