yanom blog

様々な技術について書きます

オブジェクト指向設計実践ガイドが良い

最近は、技術評論社から出版されているオブジェクト指向設計実践ガイドを寝る前に読んでいます。 実践ガイドと書いてあるだけに、オブジェクト指向の考え方ではこうするという具体的な話が分かりやすく書いてあります。
また、サンプルコードはRubyで書いてありますが、Rubyを知らない方でも分かる内容となっています。
まだ、4章の途中までしか読んでいませんが、メモがてらに記載します。
2020/07/13 8章まで読んだので追記しました。

目次

  • 第1章 オブジェクト指向設計
  • 第2章 単一責任のクラスを設計する
  • 第3章 依存関係を管理する
  • 第4章 柔軟なインターフェースをつくる
  • 第5章 ダックタイピングでコストを削減する
  • 第6章 継承によって振る舞いを獲得する
  • 第7章 モジュールでロールの振る舞いを共有する
  • 第8章 コンポジションでオブジェクトを組み合わせる
  • 第9章 費用対効果の高いテストを設計する

第1章 オブジェクト指向設計

第2章 単一責任のクラスを設計する

  • クラスを単一責任にする重要性、必要性をサンプルコードを交えて解説してあります。また、サンプルは自転車を題材に書かれています。
  • 一つことを専念するクラスを作ることによって、変更が容易になりメンテナンス性の高いソフトウェアを作ることができます。(当然それだけでは不十分ですが)

第3章 依存関係を管理する

  • この章では、オブジェクト間の依存関係を理解し、疎結合なコードの書き方を解説しています。
  • 依存関係を理解する。次のものをオブジェクトが知っているとき、依存関係がある。
    • 他のクラスの名前
    • self以外のどこかに送ろうとするメッセージ
    • メッセージが要求する引数
    • 引数の順番
  • 疎結合なコードを書く
    • 依存オブジェクトの注入(DI)
    • 引数の順番への依存を取り除く
  • 依存方向の管理

第4章 柔軟なインターフェースをつくる

  • ここでのインターフェースとはクラスが持つパブリック/プライベートなメソッドの事を意味しています。
  • パブリックインターフェースとは、クラスの主要な責任を明らかにする。変更の可能性が低い。十分にテストされている。といったもの。
  • プライベートインターフェースとは、実装の詳細に関わる。容易に変更される可能性がある。テストされていない可能性がある。といったもの。
  • また、インターフェースを見つけるのにシーケンス図を活用しようと書かれており、個人的になるほど。と思いました。必要なオブジェクトとメッセージの受け渡しを簡潔に図示することができるためです。

第5章 ダックタイピングでコストを削減する

  • ダックタイピングで共通の振る舞いを定義し、何をするかを露わにする。
  • 抽象に依存することで、より柔軟なコードを書く。

第6章 継承によって振る舞いを獲得する

  • いくつもの共通の振る舞いを持つものの、いくつかの面においては相違もある型では、継承が使えるかもしれない。
  • テンプレートメソッドパターンを使う。
  • フックメソッドを使って、superの送信をなくす。

第7章 モジュールでロールの振る舞いを共有する

  • 継承では解決できない問題について理解する。
  • 継承関係ではないが、共通の役割(ロール)がある場合には、モジュール化する。
    • 本誌では、Bicycle/Vehicle/Mechanicオブジェクトに対して、スケジュール可能であるというロールをモジュールを使って担わせています。

第8章 コンポジションでオブジェクトを組み合わせる

第9章 費用対効果の高いテストを設計する

ソフトウェア テスト技法ドリルについて

自宅にいることが多いので、大量の技術書を買い漁っているわけなんですが、
かねてより、欲しかったソフトウェア テスト技法ドリルを購入しました。
内容はタイトル通り、ソフトウェアテストの様々技法が書いてあって、
例えば、同値分割やデシジョンテーブル、CFD法等について解説してあります。
今までテスト手法を体系立てて学習したことがなかったので、とても為になります。
また、テストだけでなく設計にも活かせそうな考え方もあるので、 何度も読み返してしっかり自分に定着させたい本です。
雰囲気でなんとなくテストをしている人には必読ですので、ぜひ読んで見てください。

ブロック図生成ツールblockdiag を使ってみた

小ネタです。
最近、仕事で図を書くのはもっぱらPlantUMLですが、blockdiagというものを見つけたので記事にします。

blockdiag

有志の方がその名もわがままドリブンで開発しているOSSです。
言語はpythonで書かれているみたいです。

github.com

ブロック図以外にも、シーケンス図やアクティビティ図、ネットワーク図が書けるツールもあるようです。

個人的におっと思ったポイントは、線と線が交わるところが山なりになっていて見やすくなっているところです。
(私が知る限り、PlantUMLにはない機能です)

f:id:yanom20:20200605101945p:plain
線が交差する箇所が山なりになっている例

GitHubでIssueも受け付けていますし、OSSなので開発に参加することも出来ます。
素晴らしい世界ですね。
素晴らしいツールをありがとう。

.NET CoreでWindowsサービスを作る

今回は、.NET CoreでWindowsのサービスアプリを作って見たいと思います。

前提

サービスの雛形を作る

  • 以下コマンドで雛形が生成されます

$ dotnet new worker -o 任意のプロジェクト名

Windowsでサービス起動させるために一部修正する

  • packageの追加

$ dotnet add .\<アプリ名>.csproj package Microsoft.Extensions.Hosting.WindowsServices

  • コード修正
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHostedService<Worker>();
    }).UseWindowsService();  //Windowsで実行する場合はここを追加する必要がある

プロジェクトのビルド

$ dotnet publish -o 任意のフォルダ名

サービス登録

  • パスは絶対パスで指定してください
  • Project.exeはビルドで指定したフォルダ内に生成されています

$ sc.exe create <サービス名> binPath=<Project.exe>

起動

$ sc.exe start <サービス名>

確認は、Windowsのサービス管理画面等で行ってください。

C#のStyleCopAnalyzersを使ってみる

最近C#Windowsアプリケーションを開発しています。
Linterがほしいなと思っていたところ、 StyleCopAnalyzersというライブラリを見つけたので試してみました。
環境はVSCodeを使ってます。

やっていく

  • パッケージインストール
    • dotnet add project名.csproj package StyleCop.Analyzers
  • csproj書き換え
      <PropertyGroup>
        //中略
        <CodeAnalysisRuleSet>StyleCop.ruleset</CodeAnalysisRuleSet>
      </PropertyGroup>
  • StyleCop.rulesetファイル作成
    • この辺りを参考にファイルを作成してください。
    • 格納先はcsprojで記載したパスにおいてください。
    • なお、このファイルで検査する項目を指定できます。
  • 実行
    • 普通にプロジェクトをbuildすれば実行されます。
    • dotnet build

ちなみに、VSCodeではC#拡張機能を使ってbuild(Ctrl-F5)した場合、Linterの結果がVSCodeの画面に表示されて便利です。

突然のGWでした

最近の状況からあり得るなーと思っていたんですが、まさかほんとにそうなるとは・・・。
4月27日から5月6日までまさかの12連休でした。

といっても、外出できるわけではないのでほぼ毎日自宅のガーデニングに勤しんでました。
(姫シャリンバイ、テマリテマリ、モッコウバラなどなど植えました)

あと、第2版が出版されたReal World HTTPを読んでました。 (第1版も持ってるんですが、差分が気になり購入)
HTTP/1.1、HTTP/2.0、HTTP/3.0のこと知りたい人にはおすすめです。

その他は、Rebuild.FM聴いたり、アークナイツのイベント周回したり、子どもたちと公園でサッカーしたり・・・。
遠出はできませんでしたが、意外と充実したGWでした。

まだまだ不透明な状況ですが、気を張りすぎずに楽にいきましょう。

C#でSocket通信を勉強しています

仕事の都合で、C#でSocket通信する必要が出てきたのでお勉強しています。

https://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8h.html

このあたりを参考に仕組みを理解しているところです。
今まで、このあたりはあまりやってこなかったので面白いです。
がんばります。