C#9.0 record

C#9.0でrecord型が追加されました。
まだ実務では使用していませんが、
今後C#でとても重要な機能になると思っています。

最も活躍できるのが、DDDのValueObjectでしょうか。
今まではそれらしい事をするには等値性を表現する為に、
Equals()やGetHashCode()をoverrideする必要がありましたが、
record型はコンパイラが自動で行ってくれます。

そして定義がとても簡単に行えます。
Microsoftの説明を引用すると、

public record Person {
 public string LastName { get; }
 public string FirstName { get; }
 public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

と同じことが、

public record Person(string FirstName, string LastName) { }

と書けます。とても簡潔ですね。

リファクタリング

既存のソースコードに新しい機能や変更を加えようとするとき、
まず既存のコードをリファクタリングします。
そして切り出したり共通化したクラスやインターフェースなどを、
ソリューションやプロジェクト内のどこに記入するべきか考える必要があります。

全体の設計思想や、選択したフレームワークによって、
適切な場所があるはずですが、なかなか上手く収まらない事もあります。

そのような場合は、自分が全体の設計思想に対する理解が足りていないか、
ソリューションやプロジェクトが上手く構成できていない事がうかがえます。

リファクタリングは基本的には必要な時に行いますが、
例えばテストファースト開発のように、
開発サイクルの中で常時行う方法もあります。

年末の大掃除と同じように、まとめて後でやろうとすると大変です。
普段から少しずつ行っていればリスクも少なく、
ソリューションやプロジェクトの構成もより明確になってゆくものだと思います。

リファクタリングであまり悩むことが無いよう、
安心して開発できる環境を目指したいと思います。

デザインパターン

GoFの23のデザインパターンを学習しています。
デザインパターンの多くは、
抽象的な概念を抽象クラスやインタフェースで定義して、
継承や実装により、実クラスで表現する手法を取ります。

デザインパターンを知ると設計の幅が広がるとともに、
ソースコードを読むときの理解の助けにもなると思いました。

例えばiPhoneで使われるviewには、
Observerパターンが使われているものがあります。
Observerパターンを知っていればすぐに理解できますが、
知らないと概念の理解に少し苦しみます。

チームで開発を行う場合でも、
「ここはSingletonパターンを使おう」など、
言語を問わずに共通の概念を共有することができるので、
連携がスムーズにできそうですね。

Microsoft Code Analysis

自宅で使用している Visual studio に、
「Microsoft Code Analysis」を導入してみました。
VSの拡張機能から簡単にインストールすることができます。
コードの問題を検出して、改善・修正の提案を行ってくれるので、
初学者の方にもおすすめです。

例えば次のような冗長なコードを書いてしまった場合でも、
if(isDebug == true){ ...
コードを簡単にできる旨をヒントや警告で表示してくれて、
クリックで修正する事ができます。
if(isDebug){ ...
他にも private にできるメンバーを教えてくれたりなど機能が豊富で、
自然と Microsoft が推奨する、一般的なコードを書くことができるようになります。

会社では ReSharper を使用しているので必要無いのですが、
自宅でも同様の分析機能があると少し安心します。

Xamarin の開発環境

弊社では Xamarin を用いてモバイルアプリも開発をしております。
Xamarin はC#で iOS/Android などのモバイルアプリが開発できる、
モバイルアプリ向けのクロスプラットフォーム開発環境です。

ただし例えばiOSアプリをWindowsで開発する場合でも必ずMacが必要で、
Mono、Xcode、Visual Studio(Mac)、Visual Studio(Win)、Xamarin などの、
使用するソフト間のバージョン関係がとてもシビアです。

先日 Visual Studio(Win) Ver16.6 にアップデートした際に、
ビルドができない状態となり、原因の特定に時間が掛かってしまいました。
結局は Visual Studio の問題で Ver16.6.1 で修正されたのですが、
これを機に Visual Studio(Mac) による専用の開発環境を整えて、
開発時のソフトウェアバージョンをある程度固定する事にしました。

Windows と Mac 間の通信が不要となり、
ビルド速度が向上し、デバッグも安定するようになりました。
普段は Visual Studio(Win) で開発を行っておりましたので、
Visual Studio(Mac) やショートカットに慣れていこうと思います。

DDD

DDD(Domain-Driven Design) を勉強しています。
解決すべき問題をドメインとして捉え、
それをドメイン固有のルールなどと共にプログラムに表現していく手法です。

DDDではEntityやValue Objectなどの概念が出てきます。
C#でValue Objectを表現しようとした場合、classかstructか悩みました。
結局classで表現することに決めたのですが、
structはデフォルトコンストラクタを定義できない事が最大の理由です。
例えば正の整数を保証する為に、以下のような事ができれば、
structの利用の幅が広がるのですが実際にはできません。

struct MyStruct {
private readonly int _value;
MyStruct() { //このコンストラクタは定義できない。
throw new Exception();
}
MyStruct(int value) {
if (value <= 0) throw new ArgumentException("0以下の値は設定できません。");
_value = value;
}
…(略)…
}

Value Objectをclassで表現した場合、
中身の値は保証できても、使う側はオブジェクト自体のnullチェックが必要となります。
structの使いどころって、なかなかな無いものです。

柔軟な発想

ある機能をプログラムで実現する為に、
少し視点を変えて、別の方法を思いつくと、
意外と簡単に実装ができてしまう事があります。

例えばバックグラウンドで読み込みを行っている時に、
「Loading…」と表示される画面はよくあります。
ユーザーから見れば「Loading…」の画面が、
新たに作られて、表示されたように見えますね。
そのままコードにするとこんな感じでしょうか。
(クラスやメソッドなどは仮のものです。)

LoadingView loadingView = new LoadingView();
loadingView.Show();
// バックグラウンドで行う処理
loadingView.Close();

これでも問題ありませんが、
複数のバックグラウンド処理が重なった場合などは、
さらに処理を考える必要があったり、
表示の部分がシーケンス的であったり、少し複雑です。

視点を変えて、
「Loading…」画面の可視性が切り変わると考えた場合はこうなります。

loadingView.Visible = true;
// バックグラウンドで行う処理
loadingView.Visible = false;

「Loading…」の画面が表示されていない場合でも、
見えていないだけでずっと画面内に存在しているイメージですね。

実際には loadingView.Visible の部分は、
LoadingView の可視性を表すプロパティなどにしておきます。
こうすると、シーケンス的だった表示がステート(状態)となり、
制御しやすくなります。

難しい問題には頭を柔らかくして、
様々な視点から柔軟な発想ができると、
もっと単純に解決できるかもしれませんね。

クロスプラットフォーム

弊社ではモバイルアプリ開発にXamarinを利用しています。
得意とするC#で開発を行えることが強みです。
クロスプラットフォームの開発環境は、
ここ最近新しいものも登場し、多数あります。

・Xamarin (Microsoft)
・Flutter (Google)
・React Native (Facebook)
・Titanium (Appcelerator)
・Uno Platform (nventive) などなど。

ただしOSのバージョンで既存の動作が変更となったり、
画面形状がこれまでとは異なる、
新しいデバイスへの対応が必要となったり、
iOSでは開発環境に SwiftUI が登場したりなど、
native 周りの知識や動向の把握は常に必要です。

気軽にマルチプラットフォームのアプリが制作できると楽しいですが、
ソフトのメンテナンスにはそれなりの知識と労力が必要です。

Windows7のサポートが終了

本日2020年1月14日で、Windows7のサポートが終了します。
セキュリティ更新プログラムの提供が停止する為、
多くのPCが事実上使えなくなります。

私にとってもWindows7はとても使いやすいOSでした。
特に設定がコントロールパネルに集まっているのが好きでした。
Windows10も使いやすいと思いますが、
「アプリと機能」と「プログラムと機能」など、
同じような機能が複数あったりして、
なかなか目的の設定にたどり着けない事があります。
今後さらに使いやすく進化してほしいものです。

C# おすすめ書籍

弊社では主にC#を用いてソフトウェア開発を行っています。
そこで初学者の方向けにおすすめの書籍をご紹介します。

1. 新・標準プログラマーズライブラリ なるほどなっとく C#入門
著者:出井 秀行 氏
対象者:プログラミングを初めて学ぶ方
・プログラミングの基礎から丁寧に解説されています。
変数やif などの制御文が初めての方でも、読み進める事ができると思います。
Unityスクリプトに初めて触れる方向けの参考書としても良いと思います。

2.独習C# 新版
著者:山田 祥寛 氏
対象者:VBAなど他の言語を少しでも触れた事がある方
・C#の言語仕様やオブジェクト指向について体系的に学べます。
本書でC#の基本部分は網羅しているので、本格的に学びたい方が
最初に読む本として適していると思います。

3.実戦で役立つ C#プログラミングのイディオム/定石&パターン
著者:出井 秀行 氏
対象者:C#を実務で使う方、C#のレベルアップを目指す方
・C#で「こう書くべき」というイディオムが豊富に紹介されています。
プログラミングの難しさの一つとして、何通りもの書き方が存在する事が
挙げられますが、定石とも言える書き方をその理由とともに紹介されています。
特にLINQやコレクションの操作を磨きたい方におすすめです。

4.増補改訂版 Java言語で学ぶデザインパターン入門
著者:結城 浩 氏
対象者:オブジェクト指向をさらに学びたい方
・言語はJavaで書かれていますが、C#の基礎を知っていれば読み進められます。
デザインパターンを学ぶことで、インタフェース、継承、委譲などの使い方
とオブジェクト指向についての理解を深められます。
もっと早く読んでいれば良かったと思えた本です。

信頼できる内容を、体系的に学習する事が近道だと思います。
以上、おすすめの本でした。