質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C#

    7105questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C# 実践開発手法(日本語訳版)の本でわからないこと

受付中

回答 0

投稿

  • 評価
  • クリップ 5
  • VIEW 480

syogakusya

score 59

質問

「C#実践開発手法~デザインパターンとSOLID原則によるアジャイルなコーディング」のChapter5の
サンプルコードで、RefactoringForAbstractionのソリューション内のコードについて疑問点があります。
ここではTradeProcessorクラスで責務を3つのインターフェースに分割していますが、例えば以下のような変更があった場合、どのような対応手段があるのか知りたいです。
以下に変更の例と、申し訳程度に現状で自分なりに思いつく対応を示します。

1. 処理の前段に実行のチェックが入る場合

例えば、この処理を実行する前にデータベースに接続可能かをチェックし、接続できなければエラーログを出力して終了するという処理が加わるとします。
この場合、どのようにコードを変更するのがよいのでしょうか。

  • TradeProcessorクラスがITradeProcessPredicateを受け取り、IEnumerable<string> ITradeDataProvider.GetTradeData()を実行する前に
    bool ITradeProcessPredicate.Predicate()を実行して、戻り値がfalseならそのままリターンする
  • TradeProcessorクラスをITradeProcessorインターフェース実装クラスとし、IPredicateとITradeProcessorを
    受け取るクラスを作成する。
interface ITradeProcessor
{
    void ProcessTrades();
}

interface IPredicate
{
    bool Predicate();
}

class TradeProcessorPredicateDecorator: ITradeProcessor
{
    public TradeProcessorPredicateDecorator(
       ITradeProcessor processor,
       IPredicate predicate)
    {
       ...
    }

    public void ProcessTrades()
    {
        if (_predicate.Predicate() == false)
           return;
        _processor.ProcessTrades();
    }

}
  • 上記のITradeDataProviderバージョンを作成して、IPredicate.Predicate()がfalseを返したら、nullを返すようにする。
    ただし、ITradeDataProviderインターフェースの規約に影響を及ぼし、ITradeDataParserとITradeDataStorageの実装も影響を受ける。

2.途中で処理を終了するパターンが追加される場合

例えば、IEnumerable<string>として取得したデータの中に、データベースに保存不可能なデータが一つでも存在した場合、警告ログを出力したあと、決められたエラーログのみを出力してそのまま処理を終了するという変更が発生したとします。
この場合、どのようにコードを変更するのがよいのでしょうか。

  • 決められたエラーログを出力したあと、例外をスローしてProcessTradesメソッドの呼び出し元でキャッチする。
    この場合、決められたエラーログ以外出力してはならない関係上、catchで例外発生時の共通処理を行うことはできない。
  • ITradeParserのインターフェースを変更し、IEnumerable<TradeRecord>と終了フラグを返すようにする。
    ITradeParserの実装では、決められたエラーログを出力したあと戻り値として異常終了のフラグを返すようにし、
    TradeProcessor.ProcessTrades内でその値を参照してリターンする

以上です。特に2.のパターンのほうで頭を悩ませています。他のパターンも思いついたら追加します。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7105questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。