スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

専用、カスタムは良い響き

 実行環境、或いは開発環境によって色々と変えたい設定がある。それはもうたくさんある。そういう情報は、クラス内にハードコーディングしたくないものだ。その最たる物が、データベース(DB)への接続情報だったりする。
 データベースへの接続は、サーバー名、インスタンス名、接続ユーザー、パスワード等の情報と、プロバイダと呼ばれるクラスを使って行われる。開発時に、本番運用で使用されるDBサーバーへの接続などできない。したら怒られる。なので、開発時は開発用、テスト時はテスト用のサーバーを用意し、そこに接続して実行するというのが普通だと思っている。そういう理由で、そこかしこのクラスに散らばらないように、staticクラスのstaticな変数で接続文字列を定義てみたりもするんだけど、結局それもハードコーディングには違いなく、ビルドをしないと切り替えもできない。その場にビルド環境があるなら、それも良いかもしれないが、なければそれはもう大変だ。
 Javaを使ってWebアプリを開発してた頃は、この外部設定というのを比較的当たり前にやっていた。Apache+Tomcat+Strutsなんていう何世代も前の事でも、だ。これがC#のクライアントアプリや、ASP.NETになると、記述できる場所はweb.configか、或いはapp.configだけになる。実際、参加したプロジェクトでは、そこに書かれていた。
<appSettings>
<add key="KOCCHI_DB" value="Data Source=YYYY, Initial Catalog=ZZZZ..."/>
<add key="SOCCHI_DB" value="Data Source=YYYY, Initial Catalog=ZZZZ..."/>
</appSettings>

うん。まあ、これも外部設定だよ。でも、接続先がSQLServerとかOracleとか決まっていれば問題ない。しかし、DBMSなんてものは、プロジェクトによっては変わるもの。でも、このkeyなら、SQLServer、このkeyならOracleなんていう判定で切り替えたくはないし、そんなコードを書きたくない。という事で、DBMSの種類を接続情報とセットで持たせたくなった。appSettings内のaddタグは、keyとvalueしかない。keyとvalueという名前もちょっと…という感じがした。
 結局、何がしたかったかというと、
DBMSへの接続文字列とその(DBMSの)種類を外部ファイルで設定し、それを読み込みんで使いたい。
という奴である。究極的には、「接続先のDBMSをほぼ意識しなくても良い」になり、それは実際に仕事で実装済ではあるのだけど。
 で、まず考えないといけないのは、その設定ファイル内の設定の仕方だった。結局、設定する内容を決めないと、どう読み込むかも決められなかった。まずはこんな感じで読み込もうと書いてみた。
<twSettings>
<dbResources>
<dbResource id="KOCCHI_DB" connectionString="Data Source=...Initial Catalogue=..." dbType="SQLServer"/>
<dbResource id="SOCCHI_DB" connectionString="Data Source=...Initial Catalogue=..." dbType="SQLServer"/>
</dbResources>
</twSettings>

IDを指定する事で情報を取得する。このIDさえ指定すれば、接続情報とDBMSの種類を取得できる事になる。どこに接続しているかは、設定次第になる。.NET1.1の頃は、このカスタムな設定ファイルを読み込む実装は結構大変だったけど、.NET2.0以降は、比較的簡単に読み込む事ができるようになった。
続く。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

要素は2つ。ループは3回

後輩が奇妙な質問を投げてきた。

リストの要素は2個なんですけど、3回ループしてるんですけど、なんかわかりますか?

なんぞそれは?とか思ったけど、よくよく調べたら、共通メソッドがそういう動きだっただけの話だった。
namespace TawamureDays {

class Utils {

/// <summary>
/// (List)引数リストがnull或いは空リストかどうかを判定します。
/// </summary>
/// <param name="list">リスト</param>
/// <returns>true:null或いは空リスト</returns>
public static bool IsNullOrEmpty(IEnumerable list) {

if (list == null) {
return true;
}

foreach (var element in list) {
return false;
}

return true;
}
}
}
引数のlistがnull又は要素が0の空リストかどうかを判定するメソッドである。これを↓のような感じで使っていた
if (Util.IsNullOrEmpty(list)) {
return;
}

foreach (var element in list) {
//...処理
}
これで問題なし!と思っていたし、実際通常のケースでは問題ない。ただ、後輩君の実装では、問題点が露見した形となった。
var enumerator = list.Select(element => new Element2 {...});

if (Util.IsNullOrEmpty(enumerator)) {
return;
}

foreach (var element in enumerator) {
//...処理
}
見た目問題ないようだけど、IsNullOrEmptyのメソッド内で、最低1回ループしてしまう。この段階で、Select内のFuncが実行され、Element2クラスのインスタンスを生成し、その後何もしない(というか無駄に1つ生成してしまう)。要するに、null判定で1回余分に呼び出される事になる。後輩君のコードは、Func内ののElement2を生成した段階で、元ネタとなるelementの内部情報を書き換えてしまうらしく、思ったような動きにならなかったようだ。結局、こんな感じに直した。
//listのnull判定は事前に行う。
var list2 = list.Select(element => new Element2 {...}).ToArray();

if (Util.IsNullOrEmpty(list2)) {
return;
}

foreach (var element in list2) {
//...処理
}
共通系を直しても良いのだけど、要素の数がすごい数だったとき、どうなんだろ?とか思うし、影響範囲もでかいので、おいそれとできない。そうはいえど、やはりクラスやメソッドは、使ってナンボである、という事を実感した日だった。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 2 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。