何のために知る?
よりスピーディーに、高度な機能を品質よく開発をすすめるためには?
顧客に喜ばれるため
何をする?
C#、SQL Serverを使ったWindows 10向けのアプリケーション開発はどのように進めていくのであろうか?
モダンな開発とは?
設計、テストをどのように進めるのか?
設計、テストをどのように進めるのか?
いい設計、いいコーディング、いいテストとは何か?
どこまでできて、どこを補う必要があるか?
モダンな開発における考え方、精神は何か?
どうやる?
Visual Studioを使った、開発を体験。モダンな開発手法を知り、練習して身に着ける
Visual Studio 2019
インストール
- Visual Studio 2019 Community をインストール
- インストールする際は、Windows ユニバーサルPFはインストールしないようにする。Windows Form開発が選択できなくなる。
ソリューションとプロジェクト
- ソリューションの中で、複数のプロジェクトを管理する。プロジェクト間は互いに参照している。
- プロジェクトは、以下のような種類がある。
- クラスライブラリ
- 実行可能なアプリケーション
- 単体テストプロジェクト
- WEBサイト
github連携
- ローカルリポジトリの設定
- git -> ローカルリポジトリ を選択
イベントの削除
フォームを作成中に、ついダブルクリックしてクリックイベントを追加してしまうことがある。
- その場合は、フォームのプロパティのイベントから、クリックイベント削除
- コードを削除
フォント設定
ツール -> オプション
環境の項目から変更可能
開発手法
テスト駆動開発
ソフトウェア設計
オブジェクト指向
- 単一責務の法則
- オープンクローズ
ドメイン駆動
MVC, MVVM
プログラミングのスキルアップ
- 文法の知識を身に着け、コンパイルエラーを解決できる
- 共通化できる(何度も利用される関数や定数を定義する)
- カプセル化できる(使う側に知識を求めない)=値とロジックを同じクラスに書く
- テストしやすいコードがかける
- テストしやすいコードは、どこにも依存していない関数。
- テストが難しいコードは外部のファイルやDBなどに依存しているコード。-> インターフェースやMoqなどのツールを活用する。
- テストが難しいコードは画面部分のコード。 -> 画面には極力コードを書かない。ロジックはコントロール部分に記載する。
ソフトウェアアーキテクチャ
- MVC モデルと MVVCモデルの違い
- MVC
- Model: データ
- View: 画面
- Controller: ロジック
- MVVM
- Model: データ
- View: 画面
- ViewModel: データバインディング
- MVC
Domain
ビジネスロジックの部分。
- ビジネスロジックが変更になるとこの領域内で影響範囲が閉じるように設計する。
- ドメイン領域はほかの何も参照しないようにする。そうすることで、変更しやすい。
次のような概念を利用する。
- ValueObject
- Entity
- Helper
- Exception
- 静的ロジック(static)
- インターフェース(Repository)
Infrastructure
アプリと外部の接触部分
オブジェクト指向
値と、その値を処理する関数(メソッド)を同じクラスで管理し、ひとまとまりにする。
三大機能
- 継承
- classA : ClassB
- カプセル化
- 値を変える処理は、クラス内で実装する
- ポリモーフィズム
- Interface
- Abstruct
アクセス修飾子
ポイントは、いかにクラスの外にクラスの内部を見せずに済ませるかということが大切。クラスの中に知識をため込み、クラスを使う人が、クラスの中身を十分に知らなくても使いこなせるようにクラスを作ることが大切。クラスの中身を公開する範囲は最小限にとどめる。また、メソッド名などは分かりやすい名前を付けて、クラスの使い手が Visual Studio のインテリセンスの補完機能だけで適切なメソッドを選択できるように、クラスの作成者が考慮しておく。
オブジェクト指向言語に備わっている、そのための一つの機能がアクセス修飾子。
- public
- protect
- private
C# では次の修飾子もある。
- internal public
- internal protect
internal をつけることで、そのプロジェクト内部からのみ参照できるようにしている。
Entity
ひとまとまりの値のかたまりを保持しておくクラス。データベースから取得した1行分の値などを扱う専用のクラス。
このクラスのメリットは、値と値を処理する関数をまとめておくことができる。値と値を処理をする関数をまとめることで、クラスを使う際にわかりやすい。Visual Studioなどのインテリセンスで利用可能な処理として、関数が列挙される。
完全コンストラクタ(コンストラクタで値を代入したら、以降は変更できないようにする)で初期化するのがよい。
すべての値を Entity 定義する必要はない。ビジネスロジックの部分は Entity で扱うようにしたほうがよい。
Value Object
一つの値とその値を処理する関数を保持するクラス。Entity は関連する値のかたまりを保持するが、Value Object は完全コンストラクタで宣言する。値を変更したい場合、新たに Value Object を作成する。
すべての値を Value Object で定義する必要はなく、最低限ビジネスロジック部分のみ Value Object で扱うようにする。
基底クラスを作成して継承するとよい。基底クラスを ValueObject とすると、以下のように宣言する。
public abstract class ValueObject<T> where T : ValueObject<T>
Helper
float に関する値を扱う共通的な関数などを置いておく場所。pulic static class のように宣言して、どこからでも呼べるような関数を置いておくとよい。
拡張メソッド
public static string func(this float, val1);
のように宣言すると、a.func(val1); のように使うことができる。
列挙型の代わりに Value Object
Value Object の値により、挙動を変えたい場合、Enum のような列挙型を定義して値を定義しておく方法が考えられる。
しかし、列挙型の場合、Value Object の値と比較する必要がある。Value Object で比較の演算子を定義済みであれば、Value Object 同士の比較を行うことで列挙型の代わりを作ることができる。
public static readonly Condition Sunny = new Condition(1);
static readonly で値を設定したValue Object型を用意することで、インテリセンスにわかりやすい名前が列挙されるようになる。
もしくは、IsSunny() のようなメソッドを定義して、そちらを呼び出すことで対応する方法もある。
引数なしのコンストラクタから引数があるコンストラクタの呼び出し
public Constractor()
: this(new Constractor(val))
{
}
public Constractor(Object val)
{
_val = val
....
}
このように記載することで、コンストラクタが複数あっても、処理が一か所にまとめて書くことができる。
データバインディング
データが書き換わると、直ちに画面表示の値も変更されるようにする。データの変更と画面の表示の同期がとれることで、バグも発生しにくくなる。
ツール
Moq
テスト用の値の生成を簡単に記載できるパッケージ。NuGetからインストール可能
Chaining Assersion
テストプログラムを簡単な表現で記載できるパッケージ。NuGetからインストールすると、ChainingAssertion.MSTest.cs がプロジェクトに配置される。
Fine Code Coverage
C0, C1 のテストカバー率を測定してくれるカバレッジ測定ツール。画面上でどのコード部分のテストが通っているか表示してくれる。カバレッジのレポートを出力できる。
- 拡張機能 -> Fine Code Coverage で検索しインストールする。
- 表示 -> その他のウィンドウ -> Fine Code Coverage でテスト結果を表示する画面を表示する。
- テストを実行すると、テスト結果がFine Code Coverageのウィンドウに表示される。