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#の基礎を知っていれば読み進められます。
デザインパターンを学ぶことで、インタフェース、継承、委譲などの使い方
とオブジェクト指向についての理解を深められます。
もっと早く読んでいれば良かったと思えた本です。

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

画面デザイン

先日、ポスター制作や動画編集を専門にされている方と、
お話をする機会がありました。
どうすれば良いデザインができるのか率直に伺ったところ、
その方は「同業他社のデザインを研究する」そうです。

ソフトウェア制作の現場においても、
お客様からデザインを指定される場合や、
新規でデザインを考えなければならない場合などがあります。

特に新規でデザインを考えなければならない場合、
他の同じような機能を持つソフトはどのような画面構成をしているのか、
実際に自分が使う立場として参考にするというのは、
非常に重要なポイントだと思いました。

ソフトウェアにおいてもユーザー目線で、
使いやすい UI / UX を心がけたいと思います。

新旧開発環境

社内のPC開発環境は、主にVisual Studioを用いてC#で開発しています。
時折お客様からVB6などで作られた、
既存ソフトウェア資産の保守を依頼される場合があり、
その場合はVB6などのコードを読んで、必要な実装を行います。

Visual Studioは非常に優れたIDEなので、
古い言語や開発環境を使ってみると、特にそれを実感します。
必要な実装部分にさっと飛んで元に戻ってきたい。
自動でインデントを付けて欲しい。
コードを色で分かりやすく表示したい。

これらは普段当然のように使っている機能のなので、
とにかく様々な事が気になってしまいました。
最近の言語や開発環境は、
それだけ改善されて使いやすくなっているということですね。

それにしてもVB6が動作しているPCは、
スタンドアローンなWindowsXPが多いと思います。
現在もまだ多く使われているかと思いますが、
そろそろハードの限界も視野に入れる必要がありそうです。

プログラミングの入門書から次へのステップ

初めてプログラミングを学ぶとき、
最初は書籍による体系立った学習が重要だと以前書きました。

読みやすい、バグの起こりにくい、修正しやすい、拡張しやすいなど目的の為、
現場では様々なテクニックを用いてプログラムを作成します。
それらの技術を用いて作られるプログラムは、実際にはその多くが、
初心者~中級者向けの一般の書籍の内容でカバーできるものですが、
慣れていないと非常に難しく感じ、
学習内容と実際の現場では、大きな乖離があるように思えてしまうと思います。
最初はコードが読めない、書けないといった事態が起こります。

例えば既存のプログラムを修正する場合、
どの部分を修正すればよいかを見つけるのが最初の難関です。
コードを読む場合、クラス、メソッド、プロパティ、オブジェクト、変数など、
キーとなる部分を把握する事から始まります。
私は最初、それがうまくできませんでした。

私の場合、打開のきっかけとなったのは、
コードに色を付ける拡張機能の導入でした。
たとえばメソッドは黄色、拡張メソッドは斜体、staticメソッドは太字、
プロパティは紫色、局所変数はオレンジ色、コメントは緑色など、
自分のルールを決めて、視覚的に分かりやすくすることで、
どこでどのように使われているのか、コードの把握ができるようになりました。

あとはとにかくプログラムを少しいじって変更してみる。
動作がどう変わるか調べるというのも、当たり前の事ですがとても重要な事です。