インフォテック開発者のつぶやき: 2012/02
拡張メソッド C#
2012/02/27
VS2008が出る前の話。拡張メソッドを使用することで、列挙型にメソッドを追加できるという点に興味を持ち、早く使って見たいと思ってました。しかし、ネット上ではあまり使わない方が良い的な書き込みが多く、使うべきかどうなのか悩んでました。
しかし、実際にVS2008やVS2010を使い出すと、使わずにはいられない、使わないともったいないことが良くわかりました。VS2008以降は拡張メソッド(とラムダ式)によって、ほんとに開発が楽になりました。
自分の場合、案件毎のプロジェクト内で拡張メソッドを作ることはほとんど無く、社内用の共通ライブラリ内で大量に作ってます。最近共通ライブラリに追加している機能は拡張メソッドばかり。拡張メソッドライブラリになっていってます。
使いどころは大体以下の3つ。
1.列挙型のメソッド
今までだと例えば列挙型の名称を取得したいと思った場合、名称を取得するstaticメソッドを作成して対応していました。
string name = DockStyleFuncton.Name(DockStyle.Fill);
拡張メソッドを使うと以下になります。
string name = DockStyle.Fill.Name();
スッキリしました。インテリセンスでメソッドが出てくるので書くのも楽です。
2.処理のパイプライン化
例えばdouble値に対して丸め→絶対値→文字列変換を順番にしたい場合、
string strValue = Math.Abs(Math.Round(doubleValue)).ToString();
拡張メソッドを使うと以下になります。
string strValue = doubleValue.Round().Abs().ToString();
したいことの順番とコーディングの順番が同じなので直感的です。
これも1と同じく、インテリセンスでメソッドが出てくるので書くのも楽です。
3.genericクラスが特定の型の場合だけ利用できるメソッド
例えば以下の拡張メソッドを作ります。
public static IEnumerable〈TValue〉 Values〈TKey, TValue〉(this IEnumerable〈KeyValuePair〈TKey, TValue〉〉 items) {
if (items == null) yield break;
foreach (var item in items) {
yield return item.Value;
}
}
すると、KeyValuePairをコレクションするListや配列の場合、Valuesメソッドが使えるようになります。
同じようにKeysメソッドやContainsKeyメソッドなども作っておくと便利。
みんなが好き勝手に拡張メソッドを追加していったらえらいことになりそうではありますが、
ライブラリ化して管理すればリスクは低そう。それよりも使うことのメリットのほうが断然大きいです。
しかし、実際にVS2008やVS2010を使い出すと、使わずにはいられない、使わないともったいないことが良くわかりました。VS2008以降は拡張メソッド(とラムダ式)によって、ほんとに開発が楽になりました。
自分の場合、案件毎のプロジェクト内で拡張メソッドを作ることはほとんど無く、社内用の共通ライブラリ内で大量に作ってます。最近共通ライブラリに追加している機能は拡張メソッドばかり。拡張メソッドライブラリになっていってます。
使いどころは大体以下の3つ。
1.列挙型のメソッド
今までだと例えば列挙型の名称を取得したいと思った場合、名称を取得するstaticメソッドを作成して対応していました。
string name = DockStyleFuncton.Name(DockStyle.Fill);
拡張メソッドを使うと以下になります。
string name = DockStyle.Fill.Name();
スッキリしました。インテリセンスでメソッドが出てくるので書くのも楽です。
2.処理のパイプライン化
例えばdouble値に対して丸め→絶対値→文字列変換を順番にしたい場合、
string strValue = Math.Abs(Math.Round(doubleValue)).ToString();
拡張メソッドを使うと以下になります。
string strValue = doubleValue.Round().Abs().ToString();
したいことの順番とコーディングの順番が同じなので直感的です。
これも1と同じく、インテリセンスでメソッドが出てくるので書くのも楽です。
3.genericクラスが特定の型の場合だけ利用できるメソッド
例えば以下の拡張メソッドを作ります。
public static IEnumerable〈TValue〉 Values〈TKey, TValue〉(this IEnumerable〈KeyValuePair〈TKey, TValue〉〉 items) {
if (items == null) yield break;
foreach (var item in items) {
yield return item.Value;
}
}
すると、KeyValuePairをコレクションするListや配列の場合、Valuesメソッドが使えるようになります。
同じようにKeysメソッドやContainsKeyメソッドなども作っておくと便利。
みんなが好き勝手に拡張メソッドを追加していったらえらいことになりそうではありますが、
ライブラリ化して管理すればリスクは低そう。それよりも使うことのメリットのほうが断然大きいです。
機器配置
2012/02/20
とあるマンションのリビングの壁に照明スイッチと給湯コントローラ、そして、ビデオインターフォンが配置されていました。
一見するとそれらは床からの高さがバラバラの配置です。
私は普段から制御盤にブレーカーやリレーを配置したりタッチパネルにスイッチやランプを配置しているので部品の上端や下端、または、中心を揃えることが習慣になっています。
「あーあ、不細工なことしてるなぁ」と思いました。
しかし、実際にそれらをいじっていると「あっ!そうか」と声を上げてしまいました。
ビデオインターフォンは人の目の高さに、給湯コントローラは小さい子供の届かない高さに、照明スイッチは小さい子供が背伸びをすれば届く高さに配置されているではありませんか。
【誰が】【何のために】【どのように】【それを使うのか】
大事な事を忘れておりました。
一見するとそれらは床からの高さがバラバラの配置です。
私は普段から制御盤にブレーカーやリレーを配置したりタッチパネルにスイッチやランプを配置しているので部品の上端や下端、または、中心を揃えることが習慣になっています。
「あーあ、不細工なことしてるなぁ」と思いました。
しかし、実際にそれらをいじっていると「あっ!そうか」と声を上げてしまいました。
ビデオインターフォンは人の目の高さに、給湯コントローラは小さい子供の届かない高さに、照明スイッチは小さい子供が背伸びをすれば届く高さに配置されているではありませんか。
【誰が】【何のために】【どのように】【それを使うのか】
大事な事を忘れておりました。
もの造りしてます。
2012/02/13
今、部品造りで半田なども使ってます。
もちろん最初の研修中の時は上手くいかなかったり、時間がかかったりで大変でした。
先輩などの教えで、イメージしながらするのをモットーに頑張ってます。
気分は職人さんです♪
使ってもらえる方の事を考えて、もっと綺麗に、もっと丁寧に心を込めて作ってます。
でも、何度も同じ事を繰り返す度に早く出来るようになりましたよ。
私も、もの造りに参加してます。
もちろん最初の研修中の時は上手くいかなかったり、時間がかかったりで大変でした。
先輩などの教えで、イメージしながらするのをモットーに頑張ってます。
気分は職人さんです♪
使ってもらえる方の事を考えて、もっと綺麗に、もっと丁寧に心を込めて作ってます。
でも、何度も同じ事を繰り返す度に早く出来るようになりましたよ。
私も、もの造りに参加してます。
設計
2012/02/06
設計とは。
使って頂く人の立場にたって、安全に、使いやすく使って頂けるように、何も無い所から考える事で、設計したものを入れる(納入して頂く)事ににより、業務に支障が出る事は持っての他。
コードを書く事も、図面を引く事も、作業であって設計ではありません。
だから、上むいて考えている時は、サボっているのではありませんm(__)m
使って頂く人の立場にたって、安全に、使いやすく使って頂けるように、何も無い所から考える事で、設計したものを入れる(納入して頂く)事ににより、業務に支障が出る事は持っての他。
コードを書く事も、図面を引く事も、作業であって設計ではありません。
だから、上むいて考えている時は、サボっているのではありませんm(__)m

