0

我在 Java Tapestry 中有一个打印 3 个文本块的页面,我们称它们为 BlockOfTextOne、BlockOfTextTwo、BlockOfTextThree。对于每个文本块,如果内容超过 170 个字符,我想截断内容并添加“阅读更多”链接。

我正在使用 Java 的方便BreakIterator类来返回文本块的第一部分,在最接近 170 个字符的句子边界处剪切,然后从该边界返回文本块的第二部分。

我有这个为 BlockOfTextOne 工作。我想要关于使我的文本截断函数可对每个 BlockOfTextN 重复使用的建议,这样我就不需要重复代码。我也会感谢其他关于代码改进的建议,到目前为止,我所拥有的更多的是实验的结果,而不是专业知识。

这是我到目前为止所拥有的:

在 TML 文件中,我检查字符串是否超过允许的长度。如果是,运行 truncate 函数并打印 readmore 按钮。否则,只需打印字符串:

<t:if test="isQuestionTooLong()">
  ${getBeginningOfBlockOfTextOne()}
  <button type="button" class="readmore">Read More</button>
  <div>${getTheRestOfBlockOfTextOne()}</div>
    <p:else>
     ${case.blockoftextwholestring} 
    </p:else>
</t:if>

在 .java 文件中,我得到了文本块的第一位:

 public String getBeginningOfBlockOfTextOne() {   
    int summaryLength = blockoftextwholestring.length();
    BreakIterator bi = BreakIterator.getSentenceInstance();
    bi.setText(blockoftextwholestring);
    int first_after = bi.following(MAX_LENGTH_TEXT_QUESTION);
    String firstBit = blockoftextwholestring.substring(0, first_after);
    return (firstBit);
}

然后我得到文本块的第二位,复制了大部分代码,基本上只更改了传递给子字符串的参数:

public String getTheRestOfBlockOfTextOne(){
    BreakIterator bi = BreakIterator.getSentenceInstance();
    bi.setText(blockoftextwholestring);
    int first_after = bi.following(MAX_LENGTH_TEXT_QUESTION);
    String secondBit = blockoftextwholestring.substring(first_after, summaryLength);
    return (secondBit);
}

我知道我可以将这些分解为可重复使用的组件,但不知道最好的方法。我还希望能够为 BlockOfTextTwo 和 BlockOfTextThree 重新使用这两者。有什么建议么?

4

2 回答 2

0

这看起来应该作为一个组件来实现。当您有冗余代码时,它应该是服务(在页面和组件之间共享)或组件(如果它是面向 UI 的)。

Tapestry 中的组件非常便宜和容易,因此您应该始终考虑创建新组件。正如您可能将一个大型复杂方法重构为几个小方法(即使新方法只在一个地方调用),您应该考虑将一个非常大的页面分解为多个组件。

于 2013-09-17T20:28:44.373 回答
0

为每个要显示的字符串设置一个 @Property,并在 @SetupRender 方法中对其进行初始化。如果需要,@SetupRender 方法可以调用私有帮助方法。

或者,只需为要在页面上显示的每个字符串设置 getter 并委托给私有帮助器方法。

顺便说一句:${getFoo()}最好写成${foo}

于 2013-09-17T12:42:54.070 回答