用逻辑绑定类属性的正确OOP实践
本文关键字:OOP 实践 属性 绑定 | 更新日期: 2023-09-27 18:15:34
我有一个名为'documentsection'的类,它定义了稍后在HTML中组装的文档的一部分。其中有一些属性,哪些值是必需的(或有效的),它们相互依赖。例如:
a)有一个名为'section type'的枚举,它可以是'view'(在这种情况下,另一个名为'content'的属性包含要读取的文件的路径/文件名)。或者它可以是'text',其中'content'属性文本本身被放置在文档中。
b)还有一个名为"Action"的枚举,它的类型可以是"append"、"prepend"或"replacebytag"。在最后一种情况下,另一个属性变得相关,称为"tagtoreplace"。如果是追加/前置,这个tagtoreplace属性可以为空。
表示这种相互依赖关系的最佳实践方法是什么?我能想到的方法有好几种,但没有一种是充满美感的:
-
当调用"生成文档"的方法时,检查属性以确保它们符合此逻辑。
-
将检查放在get/set方法中。这样做的一个问题是,当我将我的section类型设置为'view'时,我可能不会设置我的'content'属性,直到一行左右之后-所以你不能拒绝在那时设置它的请求。
-
以某种方式使用单独的属性来划分用途-例如上面第一个例子中的'content'不应该在一种情况下用于文件路径,而在另一种情况下用于一堆HTML内容。这对我来说不太合适,但是为每个属性设置单独的属性似乎太过分了。
-
继承子类,每个子类都有不同的额外所需属性集。因为section类型和action类型可以有各种组合,所以我想不出一种优雅的方法来将所有这些逻辑放入这样的结构中。但我不是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
的新类,以提供额外的section。同样适用于"动作",定义一个IAction
接口与一种Render
或PerformAction
方法,你调用。
设置一个属性不应该对其他属性产生副作用。
如果你要做这样的事情,你应该使用一个方法来一次设置所有的东西
我会将HTML生成与文档生成本身分开。使用类来定义文档,然后使用其他类来生成文档的每个部分。通过这样做,您可以轻松地在以后添加新格式(或者更容易地测试文档构建或html生成)
a)有一个名为'section type'的枚举,它可以是'view'(在这种情况下,另一个名为'content'的属性包含要读取的文件的路径/文件名)。或者它可以是'text',其中'content'属性文本本身被放置在文档中。
类型属性通常是一种设计气味。有一个Section
类,为每种类型的部分派生。然后添加正确的派生类。
b)还有一个名为"Action"的枚举,它的类型可以是"append"、"prepend"或"replacebytag"。在最后一种情况下,另一个属性变得相关,称为"tagtoreplace"。如果是追加/前置,这个tagtoreplace属性可以为空。
我不清楚你是如何使用动作属性的
如果一个属性是用于文件路径的,那么这就是它的作用。如果它意味着内容,那就是它的意义所在。当一个属性可以表示两种不同的东西时,必然会出现混淆和错误。
我认为你需要子类。看一看抽象工厂模式,它是一种管理类创建的方法。