いまさら感はありますが、paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。
どうやら時間が短いほど高い評価を得られるようです。普段の業務では保守性や可読性を重視している私としてはジレンマを感じつつも、それでもオブジェクト指向ぽく実装したり、異常系処理を入れたりしているうちに、平均クリア時間を超えていたりします。
他の人が書いたコードを見ることはできないようなのですが、クリア済の問題だけでも見れればいいのにと思います。同じ要件に対して複数の人がコードを書くのは普段の業務ではないことですから。
このブログへは久しぶりの投稿となりました。最近は Qiita へ投稿しています。gRPC にも引き続き取り組んでいますので、よろしければそちらもご覧ください。
mxProject
主にシステム開発や C# によるプログラミングに関する話題を公開していきます。
2018年11月10日土曜日
2018年8月14日火曜日
C# ETW(Event Tracing for Windows)からログを取得する
ETW (Event Tracing for Windows) は Windows OS
のイベントトレースの仕組みです。ETW
を使用するとログの出力とログの記録を分離することができ、アプリケーションのパフォーマンス向上などのメリットがあります。ETW からログを取得してみます。
C# ETW(Event Tracing for Windows)へログを出力する
ETW (Event Tracing for Windows) は Windows OS のイベントトレースの仕組みです。ETW を使用するとログの出力とログの記録を分離することができ、アプリケーションのパフォーマンス向上などのメリットがあります。C# アプリケーションから ETW へログを出力してみます。
2018年8月5日日曜日
2018年7月22日日曜日
DataReader で null 値を扱いやすくする
ADO.NET の DataReader でフィールドの値を取得するとき、null 値かどうかを考慮する必要があります。
.NET Framework の初期バージョンでは nullable 構造体はありませんでしたので、DataReader には nullable 構造体を用いたメソッドはありません。その後のバージョンアップでもそのような機能は追加されていません。そのため、私は次のような拡張メソッドを定義しています。// nullの場合は例外が発生する int value = reader.GetInt32(0); // IsDBNullメソッドで判断してから値を取得する if (!reader.IsDBNull(0)) { int value = reader.GetInt32(0); }
これらの拡張メソッドを用いると、フィールドの値の取得を簡潔かつタイプセーフに実装できます。public static int? GetInt32OrNull(this IDataRecord record, int index) { if (record.IsDBNull(index)) { return null; } return record.GetInt32(index); } public static int GetInt32OrDefault(this IDataRecord record, int index) { if (record.IsDBNull(index)) { return 0; } return record.GetInt32(index); }
// nullable構造体で受け取る int? value = reader.GetInt32OrNull(0); // nullの場合には0が格納される int value = reader.GetInt32OrDefault(0);
拡張メソッドでなくユーティリティメソッドにする場合は次のようにします。
public static class DataRecordUtility { public static int? GetInt32OrNull(IDataRecord record, int index) { if (record.IsDBNull(index)) { return null; } return record.GetInt32(index); } public static int GetInt32OrDefault(IDataRecord record, int index) { if (record.IsDBNull(index)) { return 0; } return record.GetInt32(index); } } // nullable構造体で受け取る int? value = DataRecordUtility.GetInt32OrNull(reader, 0); // nullの場合には0が格納される int value = DataRecordUtility.GetInt32OrDefault(reader, 0);
なぜ今更このような記事を書いたかというと、今でも nullable 構造体が活用されていないソースコードを見かけることが少なくないためです。 .NET Framework 1 時代やそれよりも前(VisualBasic)のソースコードを流用した開発が繰り返され、その間に積極的な改善や工夫が行われないまま今に至っていることが原因にあると考えています。 そのようなソースコードでは null の可能性がある数値や日付を object 型や string 型で表しており、それによって型変換エラーやパフォーマンスの劣化を引き起こしていたりします。
List<T> などのジェネリックコレクションではなく ArrayList が使われ続けていたりするのも同じような原因だと思います。この記事を見て思い当たる節があるプログラマーの方は少し視野を拡げてみてください。その分のリターンは十分に得られると思います。
2018年7月16日月曜日
2018年5月19日土曜日
登録:
投稿 (Atom)
paiza のスキルチェックをやってみました
いまさら感はありますが、 paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。 どうやら時間が短いほど高い評価を得...
-
多くのコーディング標準では、グローバル変数は極力使用しないようにしてくださいと説明されています。 グローバル変数が推奨されない主な理由には次のようなものがあります。 どこからでも値を変更できてしまう 値が変更されたことを検知できない 値を変更する複数の処理を同時に実...
-
VB.net のソースコードを見ていると、使い終わった変数を解放するために Nothing を代入しているコーディングを見かけることがあります。これでは必ずしもリソースは解放されませんし、むしろリークの原因になります。Nothing を代入する意味を理解しておく必要があります。 ...
-
.NET Framework では例外の捕捉には Try-Catch を使用しますが、正しく利用されていないのをときどきみかけます。誤った例外処理は補足すべき例外を見逃したり、例外情報を取得できなくなったりする原因になります。 ※これは2013年に書いたものです。