2011-11-23 258 views
0

的做法我有一个叫'documentsection'的类,它定义了稍后在HTML中组装的文档的一部分。其中包含属性,以及哪些值是必需的(或有效的)相互依赖。例如:正确的OOP类逻辑的逻辑

a)有一个名为'section type'的枚举可以是'view'(在这种情况下,另一个名为'content'的属性包含要读入的文件的路径/文件名)。或者它可以是“文本”,其中“内容”属性文本本身被放置在文档中。

b)另一个名为'Action'的枚举类型可以是'append','prepend'或'replacebytag'类型。在最后一种情况下,另一个属性变得相关,称为“tagtoreplace”。如果我们添加/预先添加,则此tagtoreplace属性可以为空。

表示这种相互依赖关系的最佳实践方式是什么?有几种方法我能想到的,其中没有一个美容臭气:

  • 当调用“生成文档”的方法,经过属性,以确保它们符合这一逻辑。

  • 将检查置于get/set方法中。与此相关的一个问题是,当我将节类型设置为“查看”时,我可能不会将“内容”属性设置为之后的一行或多行 - 因此您无法拒绝在此时设置它的请求。

  • 以某种方式使用不同的属性来划分用途 - 例如上面第一个示例中的'content'不应该用于一种情况下的文件路径和另一种情况下的一堆HTML内容。这对我来说并不适合,但每个人都有不同的属性似乎过分。

  • 继承子类,每个子类都具有不同的额外所需属性集。由于节类型和动作类型可以有各种组合,所以我想不出一种优雅的方式来将所有这些逻辑都烧成这种结构。但我不是OOP大师!

有关最佳方法的任何想法?

谢谢!

+0

我认为有一个属性,它的含义取决于另一个不闻的权利。 – svick

+0

我同意 - 问题是,什么是最好的实践方式来实现b)项的功能/在需求)和? – Glinkot

回答

2

我会去用以下方法:

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是提供额外的节新类。对于“操作”也是如此,请定义一个IAction接口,并使用您调用的某种RenderPerformAction方法。

+0

我同意。感谢codecaster。 – Glinkot

1

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

如果您要这样做,您应该使用一种方法来一次设置所有内容。

+0

我认为这是一个正确的观点 - 我正在考虑是具有一组参数化构造函数只允许指定正确的套细节的其他选项。 – Glinkot

0

如果一个属性是用于文件路径的,那么这就是它的意思。如果它是用于内容的,那就是它的意思。当一个财产可以代表两个不同的事物时,就会发生混淆和错误。

我认为你需要子类。看看abstract factory pattern作为管理类的创建的一种方式。

+0

谢谢你。我同意每个财产的一个目的的概念,并且子类化可能就是这样。 – Glinkot

1

我会从文件生成自身独立的HTML生成。有用于定义文档的类,然后使用其他类来生成文档的每个部分。通过这样做,你可以轻松地添加新的格式后(或更容易或者测试文档建筑物或HTML生成)

一)有一个名为“部分类型”的枚举它可以是“视图”(在这种情况下, ,另一个名为'content'的属性包含要读入的文件的路径/文件名)。或者它可以是“文本”,其中“内容”属性文本本身被放置在文档中。

类型属性通常都是一个设计的气味。 有一个Section类,您可以为每种类型的部分派生类。然后只需添加正确的派生类。

b)中有一个称为“操作”另一枚举其可以是类型为“追加”,“前置”或“replacebytag”。在最后一种情况下,另一个属性变得相关,称为“tagtoreplace”。如果我们添加/预先添加,则此tagtoreplace属性可以为空。

我不是跟你如何使用action属性清晰。

+0

感谢那个jgauffin。 – Glinkot