皆様こんにちは!!先週に引き続き、品川の日本マイクロソフトで開催されたイベントのレポートをお送りします、FIXERアルバイトの門下です。
はじめに
Visual Studio Users Community Japan #1は、Visual Studioに限らず、 .NETやAzure等、マイクロソフトの技術・サービス・ツールについて、ユーザー同士で勉強するコミュニティーです。今回は4件の発表が行われました。
今日からできる!簡単 .NET 高速化 Tips
最初のセッションは、じんぐるさん(@xin9le)の .NET のパフォーマンスに関する発表でした。ほとんどのプログラムにおいて、「速さは正義」です。しかし、実際の開発現場では顧客への価値提供が最優先となり、パフォーマンスは後回しにされがちとなります。また、プログラムの高速化の最善手はボトルネックの改善ですが、それらはリリース後に分かることが一般的です。今回は「実装時に、ちょっとした工夫でできる」プログラムの高速化手法の紹介でした。
詳細に関しては割愛させていただきますが、ポイントとなるのは最速の環境+リソースを極限まで使い切るということです。 .NET Coreは .NET Frameworkよりも何倍も早く、またC# 7.x以降は後方互換性を持ちつつもパフォーマンスの改善がなされているため、これらの環境を使うのが高速化のポイントとなります。また、
- メモリコピーをできるだけ減らす
- 変数キャプチャをできるだけ防止する
- 非同期/並列処理をできるだけ使う
- GCを効果的に使う
これらのポイントに気をつけることで、メモリ・CPUの性能を最大限活かし、高速なプログラムを開発することができます。
「ソフトウエアが早くて困ることは無いため、意識的に速いコードを書くようにしましょう」とのことでした。
はじめよう Azure Functions
次のセッションは、かずきさん(@okazuki)のAzure Functionsのお話でした。
Azure Functionsはイベントドリブンなアプリケーション開発を行うためのフレームワークで、Azureでは従量課金のプランとApp Service Planの2通りのプランで使うことができます。また、Dockerイメージにすることもできるため、他のクラウドやオンプレでも動かすことができます。15行くらいのコードでWeb APIを公開することができ、 func init --docker-only
というコマンドを実行すると、Dockerfileを自動生成してくれます。
Azure Functionsの構成要素は大きく分けて、関数を実行するきっかけとなる「トリガー」と、引数・戻り値を外部リソースと紐付ける「バインド」の2つがあります。トリガー、バインドはHTTPはもちろん、多数のAzureのサービスも使用することができ、少ないコードでAzureを便利に使うこともできます。
Azure Functionsのアプリ開発には、 .NET に限らず様々な言語を使用することができ、また、Azureのサービスをローカルで動かせるエミュレーターもあるため、気軽に、素早く開発を行うことができます。
Azure Functionsは無料枠の範囲内でもかなり自由に使えるので、Botのようなプログラムを動かしたりする際に最適なのではないでしょうか?
世界一わかりやすいClean Architecture
~ 誤解されがちな二つのことと、押さえるべき二つのこと ~
続いてのセッションは、にゅいさん(@nuits_jp)のクリーンアーキテクチャーのお話でした。
かの有名なクリーンアーキテクチャーの図はとても良くできているがゆえに誤解されやすいものとなっており、本当に伝えたい内容は「依存性は外から中だけに向かっている必要がある」という1点だけです。クリーンアーキテクチャーの図はあくまでも例示であり、クリーンアーキテクチャーは「どんなソフトウエアにも適用可能な普遍的なアーキテクチャー」であるということが重要です。
今回のセッションでは、こちらのコードをクリーンアーキテクチャーに従って修正していくという流れで、「クリーンアーキテクチャーにおいて、制御の流れと依存方向を分離してコントロールするとはどういうことか」を学びました。
このセッションで、無事「クリーンアーキテクチャーチョットデキル」ようになりました。
C# 8.0 null許容参照型
最後のセッションは、岩永信之さん(@ufcpp)の、C# 8.0で追加されたnull許容参照型についてのお話でした。
C# 8.0での大きなテーマは「堅牢性の向上」でnull許容参照型もその一環で追加された機能です。そもそもnullとは、無効なことが絶対に保証できるポインタで、未定義よりは確定している。というものです。しかしながら、例外発生箇所と真の原因の箇所が離れがちとなるため、過剰なnullチェックが行われることがしばしばあります。また、シグネチャ(メソッド名、引数、戻り値などの情報)を見ただけではnullチェックがどのように行われているのかが分からず、nullが許容されるのかどうかが分かりづらいことがありました。C#2.0からはnull許容「値」型があり、C#8.0からはnull許容「参照」型がオプトインの形で追加されました。
C#1.0から、プログラムの流れを追ってエラーを見つけてくれる「フロー解析」というものがあり、null許容参照型もフロー解析によってチェックを行います。しかしフロー解析にも限界があり、きちんとチェックを行うためには以下の属性を付ける必要がある場合があります。
属性 | 概要 |
---|---|
AllowNull | ?がなくてもnullを受け入れる |
DisallowNull | ?があってもnullを受け入れない |
MaybeNull | ?がなくてもnullの時がある |
NotNull | ?があってもnullではない |
MaybeNullWhen | 戻り値の真偽によってはmaybe null |
NotNullWhen | 戻り値の真偽によってはnot null |
NotNullIfNotNull | 引数がnot nullの時だけ戻り値がnot null |
DoesNotReturn | メソッドを呼んだら戻ってこない |
DoesNotReturnIf | 特定の引数の時メソッドを呼んだら戻ってこない |
nullと正しく付き合っていくためにも、きちんと属性を付けてあげたいですね。
おわりに
高速化、Azure Functions、クリーンアーキテクチャー、null許容参照型と、Visual Studioに限らず幅広い分野のセッションを聞くことができ、大変勉強になりました。
Visual Studio Users Community Japanでは、10/27に.NET Conf 2019のローカルイベント、.NET Conf in Tokyo 2019を開催されるとのことで、すでに参加者申し込みが始まっています。(すでに参加枠以上の方が申し込んでいますが、抽選なのでまだチャンスはありますよ!!)
今後もVisual StudioやAzure等、マイクロソフトのツール・サービス・技術が盛り上がっていくと嬉しいですね!