2016-11-23 1 views
0

と仮定2つの抽象クラス:ブリッジのようなパターンですが、プリミティブメソッドを追加できますか?

Log: 
    property:timestamp; 
    property:message; 

    LogFormatter: 
    (String *)formatlog:(Log)log; 

この橋、AbstractionImplementorなどのLogFormatterようLog振る舞うように見えます。私の意見では、bridgeImplementorにプリミティブメソッドを追加できません。しかし、将来的にログインするためにプロパティを動的に追加し、それをフォーマットするためにサブクラスLogFormatterを使用したいと思います。これにより、Liskov Substitution principleが破損します。

誰にでも何か提案がありますか?

+0

拡張プロパティの合成についてはどうですか?ログには、 'ExtendedLogProperty'のセット、あるいは' Map'だけのセットを保持することができます。これにより、いくつかのプロパティが常に存在し、他のプロパティが失われている間に 'Log'のスキーマの一部であることが明示的になります。この時点で、 'formatlog'の契約を絞り込む必要がないので、LSPの中断はありません。 – plalx

+0

あなたのテクノロジーのロギングライブラリを見つけて、ホイールを再開発しないでください。 – BartoszKP

答えて

0

ログにタイムスタンプとメッセージのプロパティがある場合は、おそらくLogEntryを意味すると思います。

ブリッジパターンは、抽象化を 実装から切り離して、2つが非常に独立しているようにする場合に使用します。私はこれが あなたのケースではないと思います。単にLogEntryをStringとしてフォーマットしたいのであれば、LogEntryを、Stringを返すLogFormatterのメソッドにパラメータとして渡すだけです。

今後ログインするためにプロパティを動的に追加し、LogFormatterのサブクラスを使用してフォーマットする場合は、 が本当に意味するところに応じて、私はデコレータまたは戦略パターンを提案します。

編集: 以下の擬似コードは、一つのログエントリにそのようなスレッドIDとして

interface LogFormatter { 
    String format(Log); 
} 

// default implementation 
DefaultLogFormatter implements LogFormatter { 
    String format(Log) { 
     return Log.getTimestamp() + Log.getMessage(); 
    } 
} 

// decorated with thread Id 
ThreadIdLogFormatter implements LogFormatter { 
    LogFormatter formatter; 
    ThreadIdLogFormatter(LogFormatter formatter) { 
     this.formatter = formatter; 
    } 
    String format(Log) { 
     String threadid = Log.getThreadId(); 
     return formatter.format() + threadid; 
    } 
} 

LogFormatter formatterDefault = new DefaultLogFormatter(); 
LogFormatter formatterThreadId = new ThreadIdLogFormatter(formatterDefault); 

Log log = new Log("message"); 
// 2016-11-28 09:22:07.055 INFO message 
String logEntryDefault = formatterDefault.format(log); 
// 2016-11-28 09:22:07.055 INFO message (Thread 11) 
String logEntryThreadid = formatterThreadId.format(log); 
ログ{ は をスレッドID スタンプ メッセージを}プロパティを追加するデコレータでこれを実装する方法の例であります

個人的には抽象LogFormatter(またはインターフェイス)を定義し、Logエントリを何らかの形式のテキスト(行、xml、json、...)にフォーマットするLogFormatterサブクラスを実装するだけです。デザインパターンは素晴らしいですが、この場合はおそらく本当に必要ではありません。

+0

私はLogFormatterのログとサブクラスに動的なプロパティを追加することを意味します。 – Karl

+0

私はそれを編集しました。 HTH – Lini

関連する問題