NDDD

ドメイン駆動開発_フォルダー構成編_#51_タイマー処理はどこに置く?

今回は,タイマークラスはどこに置くのか?というお話をします。

タイマークラスとは?

タイマークラスとは,バックグラウンドで処理するクラスの事です。定期的にデータを収集して,何かのチェックをしたり,値を保持しておくような処理をする,画面とは別に,裏側で動作させる処理の事です。

どこに書くのがいいのか?

タイマー処理の中ではビジネスロジックを含むためドメイン層に置くのが良いように思うかもしれませんが,ユーザインタフェース層に置いたほうがプログラムの見通しが良くなります。当然ビジネスロジック部分はドメイン層に書けばいいのですが,タイマーの通知するイベントの部分だけはユーザインタフェース層に置きます。今回であればWinFormプロジェクトに入れます。

なぜユーザインタフェース層に入れるのがいいのかというと,例えば何も知らない状態から,ソースコードを呼んでプログラムを理解しようとする場合,ボタンクリックイベントなどのイベントから処理をたどります。ドメイン層に勝手に動作しているイベントがあると,アプリケーションのソースコードをすべて読まないと理解できないプログラムになります。

ボタンクリックイベントやバックグラウンド動作しているイベントはある一か所に集めて置き,アプリケーションで発生しているイベントを一目でわかるようにしておくことで,どのような時に,どのような処理が動作しているのかが,初めて見たプログラマーにも理解しやすいものになります。1000クラスや2000クラスある場合,すべてのクラスを理解するのは困難です。新規プロジェクトメンバーや,未来の保守するプログラマーのために,全体をすぐに理解できる造りにしておくことが大事です。そういった意味で,WinFormプロジェクトにイベントを集めておいて,知らないところで動作しているイベントは無いように作ったほうがいいのです。

BackgroundWorkersフォルダーの作成

WinFormプロジェクトにBackgroundWorkersフォルダーを作成します。今後,バックグラウンドで動作させる処理はすべてここに起点となるロジックのみをいれて,ビジネスロジックはドメインに置きましょう。

LatestTimerクラスの作成

BackgroundWorkersフォルダーにLatestTimerクラスを作成します。次回からLatestTimerの中身を作っていきます。

NDDD

C#プログラマーのための正しい3層構造が分かる「C#アーキテクチャー解説動画」をここで公開しています。よかったら見てみてください。

#01_プロジェクトの作成
#02_プロジェクトの追加
#03_依存関係
#04_ドメイン駆動開発でApplication層は必要?
#05_Domainのフォルダー構成
#06_Infrastructureのフォルダー構成
#07_WinFormのフォルダー構成
#08_Testsのフォルダー構成
#09_テスト駆動で実装するための事前準備
#10_テストコードとViewModelの追加
#11_テストコードを追加する
#12_ Repositoriesフォルダーの作成
#13_ Entitiesフォルダーの作成
#14_ Mockの作成
#15_フォーム画面の作成
#16_画面のコントロールデータバインドする
#17_Fakeを使ってタミーデータを画面に表示させる
#18_Fakeデータを画面に通知する
#19_PropertyChangedの方法を変更する
#20_Fakeとデータベースの値を切り替える方法
#21_Sharedクラスを作成する
#22_クラスを生成するファクトリークラスを作る
#23_#if DEBUGでFakeデータがリリースされないようにする
#24_DEBUGモードであることをわかりやすくしておく
#25_Factories以外から生成できないようにしておく
#26_Factoriesの呼び出しはViewModelで行う
#27_外部の設定ファイルの値で判断する
#28_Fakeデータを切り替える方法
#29_FakePathを設定ファイルとSharedに移す
#30_Fakeデータのバリエーション
#31_Shareクラスの活用方法
#32_ベースフォームを作る
#33_SharedにログインIDを記憶する
#34_BaseFormでログインユーザーを表示する
#35_ValueObject
#36_ValueObjectを作成する
#37_抽象クラスValueObjectを使用してイコールの問題の解消
#38_AreaIdにビジネスロジックを入れる
#39_AreaIdクラスをEntityに乗せる
#40_MeasureDateの作成
#41_MeasureValueの作成
#42_オブジェクト指向の自動化
#43_Repositoryの具象クラス
#44_例外処理
#45_例外の作成
#46_インナーエクセプション
#47_例外の欠点
#48_メッセージの区分
#49_エラー処理の共通化
#50_ログの出力
#51_タイマー処理はどこに置く?
#52_タイマークラスの作成
#53_StaticValues
#54_Logics
#55_Helpers
#56_Module
#57_トランザクションはどこでかける?
#58_特徴を見極める
#59_さいごに

 

参考図書

ドメイン駆動開発

エリック・エヴァンスのドメイン駆動設計

実践ドメイン駆動設計

ドメイン駆動

現場で役立つシステム設計の原則

エンタープライズアプリケーションアーキテクチャパターン

デザインパターン

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向のこころ

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

オブジェクト指向

ジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技
  すばらしい本です。オブジェクト指向が詰まっています。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
  サンプルコードはjavaですが,最初にオブジェクト指向に目覚めるのに最適な本です。

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本
  マンガみたいな感じで読めて,オブジェクト指向について学べます。  

Clean Code アジャイルソフトウェア達人の技

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Adaptive Code ~ C#実践開発手法

.NETのエンタープライズアプリケーションアーキテクチャ

実装パターン
  廃盤のため異常に高くなりすぎなので,様子を見た方がいい気がします。一万円のボリュームがあるかどうかは微妙です。

オブジェクト指向でなぜつくるのか

レガシーコード改善ガイド

リファクタリング 既存のコードを安全に改善する

C#でオブジェクト指向をする方法

オブジェクト指向の原則1:単一責務の原則