DisposeActionクラス

C#で後処理を行いたい場合にfinallyブロックに記載することが良くあります。
途中でreturnで抜けても、例外発生しても必ずfinallyブロックが実行されるので安心です。

たとえば以下のように記載します。


try {
    //ここで処理Aを実行
    counter++;
    //ここで処理Bを実行
} finally {
    counter--;
}

処理Aのあとにcounterを+1し、処理Bを実行後にcounterを-1するコードです。
これだと処理Aでreturnや例外発生するとcounterが-1されて正しく動作しないです。
このコードだと、処理Aだけtryブロックの外側で実行するだけで良いですが、そうもいかない場合も多々あったり。

というわけで、DisposeActionクラスを作ってみました。
いたってシンプルなクラスで、コンストラクタで与えたラムダ式をDisposeメソッド内で実行するだけです。
以下のように使用します。


//ここで処理Aを実行
counter++;
using var _ = new DisposeAction(() => counter--);
//ここで処理Bを実行

先程の問題が解決し、行数が減り、コードも見やすくなったのではなかろうかと思います。

DisposeActionのインスタンスは不要なので、本当は以下のように書けると良いのですが。現状のC#では出来ないです。


using new DisposeAction(() => counter--);

朝倉氏遺跡に行ってみて。

こんにちは mtj です。

福井の朝倉氏遺跡にいってきました。
発掘物の復元方法等色々展示されており勉強になる部分も多々ありました。

巨大な城下町復元ジオラマ等もあり そういった物を作るのも面白そうと感じました。
様々な復元を見て職人の技だなと関心しました。

職業柄エンジニアの視点になってしまうので地味にタッチパッドだったりそういった機器の動作にも惹かれました。

軸制御案件の見積もり

先日、案件の見積もりを行いました。

ざっくり言うと3軸アームを制御してアームに取り付けたセンサによりワークの検査を行うシステムで、
ワークそのものも何かしらのセンサとなります。
機能が多く、かなり見積もり工数が膨らんだため、
工数内に予定通り納められるか不安ではあるのですが、
自分は軸制御の案件は初めてなので実装を楽しみにもしています。

個人的に一番楽しみなポイントは、
ワークであるセンサの出力の波形から適した近似式のパラメータを求めるところです。
近似式を計算する関数に一回通すだけでなく、
n手間加えて若干最適化のような処理を行う仕様となる予定で、
実装するのを楽しみにしています。

まだ注文が出たわけではないのですが、
注文が出たら頑張ります。