0

我有一个类,用于生成嵌套的无序 html 列表。

class cTree {    

function cTree(){
}

public function getTree($id = NULL ){
}

private function addSubNode($iParentId, $iLevel){
}

其中 addSubnode 是一个递归函数来获得正确的嵌套。

现在,我想在我的网站上有两个导航菜单。两个无序列表,但标记不同。

在我看来,有 3 个选项:

  1. 将一个额外的变量传递给 getTree() 和 addSubNode(),然后使用 if/else 结构。我不喜欢这样,因为它不可维护。

  2. 向类中添加两个额外的函数,因此我将拥有例如 getTopTree()/getFooterTree 和 addTopSubNode()/addFooterSubNode();

  3. 创建两个新类(cTopMenu 类扩展 cTree / cFooterMenu 类扩展 cTree)并根据我的喜好编辑 getTree/addSubNode。

如前所述,我不喜欢第一个选项,但不确定第二个和第三个。最好的设计选择是什么?

额外的例子,使情况更清楚。它与上面的不一样,但绝对可以比较。我有一棵用于导航的树:

<ul>
  <li><a href="/x">Item 1 </a></li>
  <li><a href="/x">Item 2 </a></li>
  <li><a href="/x">Item 3 </a></li>
</ul>

然后我有另一个,带有管理选项:

<form method="post">
 <ul>
   <li>
       <input type="text" value="Item 1" />
       <input type="checkbox" value="1" id="visible_1" name="visible[]"> 
       <label for="visible_1">&nbsp;visible</label>           
   </li>
   <li>
       <input type="text" value="Item 2" />
       <input type="checkbox" value="1" id="visible_2" name="visible[]"> 
       <label for="visible_2">&nbsp;visible</label>           
   </li>
   <li>
       <input type="text" value="Item 3" />
       <input type="checkbox" value="1" id="visible_3" name="visible[]"> 
       <label for="visible_3">&nbsp;visible</label>           
   </li>
 </ul>
</form>

基本上是同一棵树。现在我扩展了基本的树类,替换了 getTree() 和 addSubNode() 函数。

4

1 回答 1

0

如果您能告诉我们两个预期的标记是什么以便建议一种方法,那将非常有帮助。话虽如此,我可以尝试部分答案:

  • 正如您所说,第一个选项似乎不是一个好方法,因为这将决定在客户端上做什么(即 if/then/else 部分)的责任。这导致在许多地方重复该声明,从而导致测试和可维护性问题。
  • 我在第二种方法中看到的问题是,如果你这样做,cTree 的一个实例将不会代表一棵树,而是某种树形函数集合。因此,您将使用一些 OO 结构,但不会遵守 OO 范式。此外,请考虑如果您以后决定拥有一种新类型的树(例如侧边栏树),您应该添加新的函数集(getSideTree()/ addSideSubNode()),这也不会扩展。

恕我直言,问题是您是否应该通过为每种情况创建特定的子类来处理这种情况,或者它们是否只是cTree与另一个对象协作以获得所需输出的两个实例。正如我之前所说,如果不知道两个预期输出,就很难判断。

编辑 根据新信息,我猜这两种方法(子类化或组合)都是有效的:

  • 子类化。我会有一个抽象类 ( cTree),除了渲染节点之外,它可以做所有事情。执行此操作的方法将是抽象的,具体的子类 (topTreefooterTree) 将负责处理此问题。您可能想查看模板方法模式
  • 作品。在这里,您将只有一个树类负责渲染树结构并将节点渲染委托给另一个对象。该其他对象将在单独的层次结构中建模(例如treeNode,带有topNode和的抽象类footerNode)。我喜欢这个,因为它清楚地表明树之间的不同不是它们的结构,而是节点。

如您所见,第二个选项是将子类中的重写方法实现转换为多态对象的层次结构。使用哪个选项取决于渲染过程的复杂性和个人喜好。

高温高压

于 2012-12-05T19:45:01.297 回答