0

テキストの 3 つのブロックを出力する Java Tapestry のページがあります。それらを BlockOfTextOne、BlockOfTextTwo、BlockOfTextThree と呼びましょう。テキストの各ブロックについて、コンテンツが 170 文字を超える場合は、コンテンツを切り捨てて「続きを読む」リンクを追加したいと考えています。

Java の便利なBreakIteratorクラスを使用して、テキスト ブロックの最初の部分を返し、170 文字に最も近い文の境界で切り取ってから、その境界に続くテキスト ブロックの 2 番目の部分を返します。

これは 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);
}

次に、テキスト ブロックの 2 番目のビットを取得し、コードの多くを複製します。基本的には、部分文字列に渡される引数のみを変更します。

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 指向の場合) にする必要があります。

タペストリーのコンポーネントは非常に安価で簡単なので、常に新しいコンポーネントを作成することを検討する必要があります。大きな複雑なメソッドをいくつかの小さなメソッドにリファクタリングするのと同じように (新しいメソッドが 1 か所でしか呼び出されない場合でも)、非常に大きなページを多数のコンポーネントに分割することを検討する必要があります。

于 2013-09-17T20:28:44.373 に答える