0

製品情報を表示するページの場合、同じ内容を示すが、異なる形式 (gif、png、jpg など)、異なる品質 (jpeg 圧縮)、異なる画像のセットから最適な製品画像を選択する必要があります。サイズ(サムネイル、小、中、大)など

どちらを選択するかは、ユーザーのブラウザ、ページの現在のサイズ、画像の目的などによって異なります。

現在の解決策は、次のような現在の要件に従って SQL クエリを作成することです。

SELECT img.id 
FROM img 
WHERE img.format IN ('GIF','JPG') 
AND img.width <= 1000
ORDER BY img.quality DESC

これは簡単な例で、元の例はもっと複雑です。このステートメントを作成する Java コードは、多くの if と case を使用しており、非常に醜いものになり始めています。

このようなヒューリスティックをJavaで実装する最良の方法は何ですか? 役立つライブラリはありますか?おそらく、ルールオブジェクトを定義する行に沿って:

Engine engine = new Engine();
engine.addRule(new IncludeRule("format", {"GIF", "JPG"}));//only gif and jpg
engine.addRule(new MaxRule("width", 1000));//max width
engine.addRule(new WeightedRule("quality", DESC));//go for high quality
Image result = engine.getResult();

ルール エンジンを検索したところ、JSR やいくつかのオープン ソースのルール エンジンもありますが、それらはすべてビジネス ルールを扱っているようです。

私たちは車輪の再発明をしているという強い気持ちを持っており、このものの正しい名前がわからないため、解決策を見つけることができません;-)

どんな助けでも大歓迎です!

4

1 に答える 1

1

SQL クエリを作成するだけの場合は、おそらくエンジンを自分で作成できます。

public interface Rule{
    String getSQLWhereClause();
    String getSQLOrderClause();
}

public class Engine
{
    String buildSQLFromRules(Collection<Rule> rules) {
        String s = "SELECT IMG.ID FROM IMG";
        String w = "";
        String o = "";

        for(Rule r : rules)
        {
             if (r.getSQLWhereClause() != null) {
                 if (!w.isEmpty()) { w = w + " AND " }

                  w += r.getSQLWhereClause()
             }
             ... same for order
         }

         return s + (w.isEmpty()? "" : " WHERE " + w) + (o.isEmpty()?"": " ORDER BY " + o);
      }
 }

次に、インターフェイスを次のように定義できます。

 public class MaxRule implements Rule
 {
       String fld;
       String max;

       public MaxRule() { ... }

       String getSQLWhereClause() { return "img." + fld + " <= " + max; }
       String getSQLOrderClause() { return null; }
 }
于 2010-10-15T17:16:00.410 に答える