C#でラムダ式を書く方法1

C#でラムダ式を書く方法 #08_delegate_引数2つ

前回は,delegateを使うことで,判定方法を外から渡せるようになることを解説しました。ただ,前回作成したShiki1やShiki2は判定する桁数が固定されていました。

このように,Shiki2であれば,「4文字以上」というように,「4」という桁数が固定されいます。この桁数を可変的に指定できるように,桁数の引数を追加し,桁数が2つのdelegateを作成してみたいと思います。

ボタンの追加

2つの引数でのdelegateを作成するために,またボタンを1つ増やします。button5を追加してダブルクリックをし,クリックイベントを自動生成します。

前回作成したdelegateは, stringの引数が1つでした。

今回これに加えて 桁数も追加したいので, 新たにdelegateを作成したいと思います。

新しいdelegate

前回作成したdelegateと同じような感じで 新しいイベントを作成します。

異なる点は,「int len」という,intの引数が1つ増えているということです。あとdelegateの名前は同じものが使えないのでLenCheck5としています。なぜ「5」なのかというと,ボタンの番号と合わせているということです。もちろん名前は何でもかまいません。

これでstringと桁数であるlenを投げたらboolを返却するというdelegateが作成できました。

GetValueメソッドの作成

ここまでで,新しいdelegate作成 したので,新しいGetValueメソッドを作成します。

名前はボタンに合わせてGetValue5とします。

引数は先ほど作成したdelegateであるLenCheck5を受け入れるようにしますが,その際は,桁数の指定も必要になるため,「int len」の引数も追加しています。

lenCheckの型がLenCheck5となったため,if文のlenCheckでは,第2引数に桁数を指定する必要が出てきます。ここにメソッドの引数である「len」を指定すれば,LenCheck5のdelegateにチェックする文字列と,桁数が引き渡されます。

新しい式の定義

ここまででdelegateのLenCheck5と,そのdelegate使用するメソッドであるGetValue5を作成しました。ここでは,そのLenCheck5に対応するメソッド(式)を定義していきます。例えばこんな感じで定義します。

Shiki3とShiki4を定義してみました。 どちらも stringとintを引数にし,boolを返却する メソッドの定義です。これはLenCheck5で定義した定義と同じ定義なので,LenCheck5として扱うことができるわけです。2つ作った理由は,判定方法を微妙に変えています。それぞれが汎用的に使用できるメソッドになっています。

Shiki3では,引数の桁数と同じ時にTrueを返却するメソッドを定義しました。「==」で判定する場合は,桁数を自由に変更できるためこの式は汎用的に使用することができます。Shiki4では「>=」で判定する式を作成しました。これも引数で桁数を自由に変更できるため,「>=」で判定する際に,汎用的に使用できるメソッドになっています。

button5_Clickイベントの実装

ここまで出来たら,それを呼び出すためのbutton5_Clickイベントを実装します。button4_Clickの中身をコピーして,GetValue5を呼び出すように変更すれば,簡単に実装することができます。

GetValue5では,引数が,string[],int,LenCheck5になっているため,それに対応させます。string[]は今まで通り,valuesでOKですね。intの部分はチェックする桁数になります。今回は3にしておきましょう。LenCheck5の部分は,今回メソッドを2つ作成したので,どちらを指定しても動作します。Shiki3とShiki4ですね。「==」でチェックしたい場合は「Shiki3」,「>=」でチェックしたい場合は,「Shiki4」を引数にセットすれば,それに従って動作するということです。今回は「Shiki3」を設定してみましょう。 

実行

この状態で実行し,button5を押下すれば,結果を確認できます。

「CCC」と出力されていましす。今回は「Shiki3」を設定し,桁数を3にしたため,3桁イコールの文字列のみが出力されることになり,その結果「CCC」のみが出力されているということになります。これでdelegateのLenCheck5が正しく動作していることが確認できました。GetValue5を呼び出すときの引数を,3以外の数値にすれば,異なる桁数でチェックされることが確認できるはずです。またShiki4を引数として渡すことで,「>=」で判定される事の確認できます。値をいろいろ変えて,確認してみてください。

オブジェクト指向の原則 単一責務の原則

C#を正しい3層構造で造れてますか?

非売品コースを受け取る

#00_はじめに
#01_単一責務の原則とは
#02_原則違反の例
#03_変更理由単位でクラスを分ける
#04_3層構造の例
#05_修正箇所を最小にできる
#06_修正する場所が明確になる
#07_共通化しましょうという話ではない
#08_少々悪いコードでも問題視しない理由
#09_探しやすいコード
#10_クラスは機能ごとに小さく作る
#11_小さなクラスがそれぞれに協調して目的を達成させる
#12_多数の部品群のなかから摘まんで作る
#13_クラスはどこまで小さくすればいいのか
#14_アンダーソン式単一責務の原則
#15_最小カプセルの検証_監視タイマークラス
#16_最小カプセルの検証_受注画面クラス
#17_最小カプセルの検証_ユーザークラス
#18_最小カプセルの検証_商品マスターデータアクセス
#19_登場人物に合わせたモデリングの四角と線
#20_四角と線を最小カプセル化する
#21_アンダーソン式手順
#22_パターンを見つけ出す
#23_プログラミングの自問
#24_さいごに

【参考図書】ピーコックアンダーソンが参考にした書籍一覧