[Effective C#] 項目6 値型と参照型の違い

今日は酔っ払いです。酔っ払いなのに、ちょっとややこしいことをやる必要が出てきました。「項目6 値型と参照型の違い」です。

これは割と賛否両論あると思います。Java と C# の大きな違いの一つです。細かい話は MSDN LIbrary を参照してください。

11.3 クラスと構造体の違い

ちなみに、私は値型自体は嫌いではないのですが、違いが分かりづらいので、扱いには注意すべきだと思います。注意できない時は値型は使うべきではないとすら思っています。

理由は以下のコードがあったとき、

Employee employee = new Employee();
employee.Name = "Employee Name";
Employee temp = employee;
temp.Name = "New Name";
Debug.WriteLine(employee.Name);

[Effective C#] 項目5 ToString() を常に実装すること

本日の Effective C# は、「項目5 ToString() を常に実装すること」です。

これですね。私は Object.ToString() メソッドに関してはいろいろと疑問をもっていたわけでして。

例えば .NET Framework のグリッドビューなどは、デフォルトでは Object.ToString() メソッドの戻り値が値として表示されます。例えば顧客一覧というグリッドビューに会社名を表示したければ、会社オブジェクトの ToString() メソッドは会社名を返す必要があります。

public class Company
{
    // プロパティは省略。
    public override string ToString()
    {
        return this.CompanyName;
    }
}

こうしておくと、確かに UI 上には会社名が表示されるのですが…。これだとデバッグのときとか、ちょい不便なんですよね。

public void AddCompany(Company company)
{

[Effective C#] 項目4 #if の代わりに Conditional 属性を使用する

仕事忙しいので現実逃避。

本日は「項目4 #if の代わりに Conditional 属性を使用する」です。

#if なんかは C 言語のプリプロセッサなんかでおなじみなので、よく知っていたのですが、Conditional 属性については全く知りませんでした。

public void ShowFunctionName() {
#if DEBUG
    Debug.WriteLine((new StackTrace()).GetFrame(1).GetMethod().Name;
#endif
}

とか、デバッグ時はスタックトレースが見たいとか、そういうのを書く時があります。書籍ではこの方法は問題が起きる場合があると書いてあります。

[Effective C#] 項目3 キャスト時には is あるいは as 演算子を使用すること

もう飽きてきた。(笑)

本日は「項目3 キャスト時には is あるいは as 演算子を使用すること」です。

C# には C++ ライクなキャストのほかに、is 演算子as 演算子があります。

余談ですが、C# というか .NET Framework には例外は例外的なことに使うというという方針があります。キャスト演算子でキャストに失敗することが予測される場合、それらを例外で処理すべきではないです。

as 演算子は、キャストに失敗した場合 null を返します。is 演算子はキャストできない場合は false を返します。

CustomType custom = (CustomType)Factory.GetObject();
custom.Invoke();

工業的にいえば誰でもできるようにするってのは大事なんだと思うけど

tag: 

ソフトウェア産業というのは建築業がモデルと言われていてですね。

上流設計をしっかりして、テンプレート化して、開発の現場は誰でもいいみたいな感じなんです。でもこれだと、破綻するんですよね。

The Source Code Is the Design で、柴田さんも述べられていますが、

上流の設計から実際のコーディング・デバッグまで、すべての活動がソフトウェア設計活動であり、すべてが重要であると述べられています。しかし、上流設計だけが重要で、それさえできれば、後の実装(コーディング)・デバッグは誰がやってもできると信じて軽視しているソフトウェア開発が多いのではないでしょうか。その結果、レベルの低いプログラマー(作業員?)が大量に投入されて、負債としてのソフトウェアが作られてしまうか、最後にプロジェクトが破綻してしまう結果になるのではないかと思います。

実際には、誰でも開発できるとは思っている人は少ないみたいなんです。ところがどっこい。現実の世界じゃ、開発者をかき集めても望んだスキルレベルの人が集まらない、みたいな感じなんですよね。現場には人事権がない場合が多いですし。

[Effective C#] 項目2 const よりも readonly を使用する

本日で Effective C# の復習も二日目です。

って、項目50 まであるんですな。More Effective C# もあるから、毎日頑張っても三カ月以上かかるのか…。気が遠い。(笑)

まあ、「項目2 const よりも readonly を使用する」です。

// 定数で宣言。
public const int MaxValue = 15;

// readonly フィールドで宣言。
public static readonly int MaxValue = 15;

の違いについてです。(実際には、「項目1 アクセス可能なデータメンバの代わりに常にプロパティを使用すること」の通り、フィールドではなく、static プロパティを使う方がいいと思います)

[Effective C#] 項目1 アクセス可能なデータメンバの代わりに常にプロパティを使用すること

なんか今日から Effective C# の復習でもやってみます。

本日は「項目1 アクセス可能なデータメンバの代わりに常にプロパティを使用すること」です。

これはまあ、超当たり前というか。オブジェクト指向で大事なカプセル化というのは、外からは分からないように処理をはさめるようにすることでもあるので、フィールドを公開してしまうとこれができないというか。

でもまあ、スタイルとして、とりあえずフィールドで、必要が出てからリファクタを利用してプロパティに変更するとかいう手段もあります。

RHEL 5/CentOS 5 ってユーザーに開放するもんじゃないのかも

tag: 

某社のソフトのぜい弱性の調査のためにいろいろと調べものな毎日です。

そんなわけで、今日は PHP のセッションの取り扱いについてです。

Cent OS 5 では、セッションはファイルに記録されるみたいです。

$ ls -l /var/lib/php/
total 84
drwxrwx--- 2 root apache 81920 Jan 6 21:48 session

なので、apache グループで apache が起動していないとだめで、suEXEC のときはセッションが使えなくなります。

というか、恐ろしいのが apache グループならばセッションファイルのリストが取れる (= セッション ID が分かるし、値が取得できる) なんですねぇ。一つでもぜい弱性があるソフトウェアが入っていたら基本道連れです。(例えば PHP code injection とか)

なので、アプリケーションごとに実行ユーザーを変更するってのは当たり前のことっぽいです。ですが、CentOS 5 には FastCGI が入ってないのでしょんぼりです。

ちなみに、Ubuntu だと、

ヘアピン NAT

突然ですが以下のような一般的な構成の時です。

ブロードバンドルーター
192.168.1.1
公開サーバー
192.168.1.2
パソコン
192.168.1.128

んで、サーバーを公開するために、ブロードバンドルーターで DNAT をかけています。

このとき、インターネット側からは、グローバル IP Address でアクセスすれば、DNAT されてサーバーに接続できます。ですが、LAN 内からは難しい。(LAN 内からは DNAT が効かないので、ブロードバンドルーターがパケットを受け取って無反応になる)

単純な解決法だと、LAN 内のパソコンからは 192.168.1.2 でアクセスさせて、LAN 外のパソコンからはグローバル IP Address でアクセスさせる方法があります。

ただし、この問題は結構問題がありまして。

練習と本番

Effective Java 等の訳者である柴田さんの blog に興味深いエントリがありました。

Practice, Practice, Practice

残念ながら、ソフトウェアの開発現場では、本当に仕事の中で練習している人がほとんどではないでしょうか。

本当だったら、仕事で必要な知識は仕事中に覚えるべきで、それじゃ足りないならば、大学などできちんと教育を受けた人を雇うべきだと思うんですよね。

でもまあ、現実の話ですが、柴田さんのように仕事時間外で練習をしている人はいっぱいいるのですよね。そういう人々に追いついて追い越そうと思ったら、仕事時間中だけの練習では絶対に無理です。(天才ならば話は別ですけど)

ページ

まさくらのブログ RSS を購読