fc2ブログ

ネタつつき170 - 価値がないとされている古い情報技術について思う事

 IT業界の技術的変化は速く、秒進日歩と言われているぐらいです。私はこの業界に10数年従事しており、多くの技術が使用されなくなっていくのを目にしました。そして、学習するのをあきらめた技術者、昔に拘る技術者、新しい技術だけに飛びつく技術者、昔の技術を否定する人、・・・など、秒進日歩の変化に楽しみながらついて言っていない人を数多く目にしました。しかしながら、私はそれらの技術者に同意できません。何故ならば、私の持論は温故知新であり、無駄になった学習や経験は一切ないと考えているからです。
 IT業界は技術がすぐに使えなくなるという人が居ます。確かに古いプログラミング言語などは、実行環境も整備されておらず、動かすことすらできません。また、その仕様がわからないレガシーなシステムの革新などに悩まされた経験もあり、そう言いたい気持ちもわかります。しかし私は、完全に同意することはできません。何故ならば、そういった表面的な事は、真の技術ではないからです。真の技術とは、思想も含めたものであり、動作環境がなくなっても、その思想から学ぶべきことが多いからです。
 古い技術から学ぶべきものがないと考えている人は、今一度考えてみてください。実行環境すらないような古い技術でも、分かったつもりになっているだけではないでしょうか?もし本当に理解しているのならば、貴方は実装できますか?実装できないのであれば、その古い技術を発明した人の過去の技術力に、到達していないと考えていいと思います。つまり、わかっているつもりになっている古い技術すら、真の理解にほど遠いのです。分かっているつもりで、古い技術を馬鹿にするのは間違っています。ですから私は、新しい技術はもちろんのこと、古い技術もいまだに学んでいます。
 例えば、COM (Component Object Model)を覚えているでしょうか?COMの思想の特徴は、インタフェースプログラミングにあります。インタフェースを正しく設計し、適切に実装すれば、実装するプログラミング言語に関係なく、再利用可能なプログラムが得られます。この考えは、情報技術の本質を表わす、いまだに凄い概念です。今はもうCOMプログラミングをしませんが、システム設計能力の一部として生き続けています。
 COMはいまだに現役だという人もいるかもしれませんから、もっと古い例を挙げます。機械語は学習していますか?今はもうアセンブラで開発する人はごく少数でしょうが、それでも未だにハードウェアは、機械語が存在しなければ動作しません。学ぶ意義があります。
 それでも、役に立つから例としてふさわしくないという人が居るかもしれませんから、念押しにもっと動かないものを挙げます。BASIC、COBOL、FORTRANを無駄だと思いますか?私は思いません。何故ならば、それらの文法や技法はいまだに、私の実装能力の一部として生き続けているからです。オブジェクト指向プログラミングが当たり前になった今、純粋な命令型言語は何の役に立つと思われるでしょう。しかし、オブジェクト指向プログラミングは命令+データ+αなので、命令型言語の概念もその一部であり、知らなくてもいいというものではありません。構成要素を知らなくてもいいという事はないでしょう。それに、最終的に機械は命令型の概念で動いています。なので私は、直接使用しない構造化設計技法(私が社会人になった時すでに使えないとされていた)も学び、たまに復習しています。
 秒進日歩のIT業界に身を置けば、古い技術に意味がないと考えがちです。しかし、本当の技術とは、思想を含むものであり、知らなくていいものなんて一つもありません。過去の記憶を、一切覚えていなくてもいいという人はいません。技術の習得もそれと同じです。技術者を名乗るならば、新旧、形式、仕事が来る、という風な表面的な物事で判断せず、深く考え抜き、奥底に潜む知識の宝物を見るべきではないでしょうか?そう考えない人が居る事は承知していますし、その人が自分の持論を持つことを尊重しますが、私自身はそう考えています。
スポンサーサイト



テーマ : 文明・文化&思想
ジャンル : 学問・文化・芸術

C#文法リファレンス - 選択文(if文)

概要
 条件に応じて実行する処理を変えたい場合に使用する文です。入れ子にして複数の条件を階層的に記述することも、else if文を使用して、フラットに記述することもできます。

日常でたとえると
 人生は選択の連続です。人は普段から状況を判断して行動しています。

使用に適した状況
 状態に応じて実行するべき処理が変化する場合。

サンプル

/*----------------------------------------------------
 * 
 *  選択文(if文)
 *  
 ----------------------------------------------------*/
using System;
class Sample
{
    static void Main()
    {
        //C#は論理式で判定する
        bool flag = true;
        if ( flag ) Console.WriteLine( "true" );
        else Console.WriteLine( "false" );
        flag = false;
        if ( flag ) Console.WriteLine( "true" );
        else Console.WriteLine( "false" );

        //入れ子にできる
        //elseはもっとも内側のifと結びつく
        int i = 10;
        if ( i != 0 )
            if ( i < 10 ) Console.WriteLine( "10は10未満である。" );
            else Console.WriteLine( "10は10未満ではない。" );
        else
            Console.WriteLine( "10は0ではない。" );

        //{}で括ると見やすい
        if ( i != 0 ) {
            if ( i < 10 ) {
                Console.WriteLine( "10は10未満である。" );
            } else {
                Console.WriteLine( "10は10未満ではない。" );
            }
        } else {
            Console.WriteLine( "10は0ではない。" );
        }

        //複数の条件がある場合はelse ifを指定
        if ( i != 0 ) {
            Console.WriteLine( "10は0ではない。" );
        } else if ( i < 10 ) {
            Console.WriteLine( "10は10未満である。" );
        } else {
            Console.WriteLine( "それ以外" );
        }
    }
}


文法
 「if」キーワード、ブール値を返す式(丸括弧で囲む)、真(true)のとき実行する処理を記述します。波括弧は、1行のときは任意で、2行以上の場合絶対に必要です。ですが、慣れないうちは1行の時も囲んだ方が無難です。また、「else」キーワードを使って、偽(false)のときに実行する処理を記述することもできます。
 さらに、if文の中にif文を書いて階層化することも可能です。また、「else if」キーワードを使って、他の条件を記述することにより、フラットに記述する事も可能です。

解説
 プログラムは指定された値に応じて処理を変更します。それを実現するには、何らかの条件の真偽を確かめ、真偽に応じて実行する処理を変える必要があります。そのためにあるのがif文です。
 If文は柔軟に条件を判定することができます。条件はブール値を返すものならば、どのような記述でも可能です。例えば、比較演算子を使って値を基準値と比較することも可能ですし、妥当性を判定するブール値を返すメソッドを指定することも可能です。さらには、階層上に記述することも、フラットに記述することも可能です。
 以上のようにif文は柔軟性が高いですが、それ故に使い分けが難しいかもしれません。おそらく、初心者はこの事に戸惑うでしょう。幸い、If文に公式なルールはないものの、経験則である程度は決まっています。大まかなルールは三つだけです。
 第一に、階層化は極力避けます。階層化をすると、実行イメージが湧きにくくなり、プログラムを理解しにくくなります。第二に、多岐選択文の使い分けが大切です。多岐分岐は値に基づき処理を分岐する方法なので、複雑な条件式が居る場合、もしくは単一の定値で処理がきまるのではなく、複数の値の条件により決まる場合はif文を使用します。第三に、条件が複雑化した場合はブール値を返すメソッドにします。こうすることにより、プログラムが簡潔で読みやすくなります。
 現場によってはより細かいルールが定められている場合がありますが、主にこの三つのルールを覚えておくと臨機応変に対処できるでしょう。

テーマ : プログラミング
ジャンル : コンピュータ

中の人の徒然草453 私の幸せ

 先週も色々考えていました。その中で、幸せを感じたときに関する話題を書きます。私が幸せだと感じた瞬間は、乗算の非対称性について考えているときです。
 足し算の場合、5 + X = 0とすれば、Xは-5と1対1対応できます。しかし乗算は、整数の範囲で考えると、5 * X = 0のXは0です。しかし、4 * X = 0の答えも0です。これでは、多対一の対応になってしまいます。果たしてこれでいいのでしょうか?私は非常に気持ちが悪いです。
 この気持ちの悪さは、情報技術者ならばわかってもらえると思います。どの値を渡しても0を返すカリー化された関数は非常に不気味です。何故ならば、情報が消えてしまうからです。何の数字を乗算した結果0になったのか、その大切な情報が一切消えてしまうのです。全てを無にしてしまう関数ほど気持ちが悪いものはありません。
 この問題について思ったのは、「そもそも0という記号は情報が欠けている」です。これが原因で、0は無であり無限でもあることになってしまうと思います。計算履歴も消えてしまうし、非常に不完全な情報だと言えます。
 システム開発では、未分化のよくわからない情報をそのままにしておくと、お客様に怒られます。何故ならば、それではシステムが動かないからです。一応その他の情報を使って、稼働はできますが、ほしい情報が未整理なままだと、お客様は当然困ってしまいます。知りたい情報を処理しない情報システムは、お客様にとって無価値です。そのような感覚が身に染みているので、乗算の非対称性は非常に気持ちが悪いのです。
 では、どうやったら、演算の途中経過を記録できるのでしょうか?それは、データを増やせばいいだけです。例えば、5 * 0 = 0( *, 5 )という具合に記号表記すれば、何の演算をしたのかと、何の数値を使用したのかが一目でわかります。むろん、計算式というものは、書いている間は計算過程も見えています。しかしながら、機械目線で見ると、結果の値が出た時点で途中の情報が消えてしまうのです。だから、こうやってオブジェクトのデータを増やすことを考えます。こうすると、関数の逆演算もできるようになって便利です。
 数分間こんなことを考えていると、ふと違う疑問がわきました。マイナス値は度数に変換できないだろうかと。5 + ( -5 ) = 0 は幾何学的に考えると、向きを180度変えて5増加したとする事ができます。ならば、270度変えたらどうなるのでしょうか?さらに言えば、1020度ぐらい変えたらどうなるのかな?もっと言えば、2次元的発想を超えて、多次元ならばどのようになるかな?突き詰めれば、無限次元の空間で、演算をするとどうなるのかな?と思考がさまよいだしました。
 このとき思ったのですが、もしかしたら空間と演算は切っても切れない関係なのではないでしょうか?人間は無意識に空間を設定しており、空間に依存しない純粋な関数なんてこの世に存在しないのかもしれません。そういえば、線形代数学というものがありました。これは、プログラミングには必ず実行環境があるのと似ています。ならば、機械と人間の差は何だろう・・・
 私はよく、移動時間等の空白時間にこんなことを考えています。それにしても、世の中は不思議に満ちています。この世の中、分からないことだらけです。乗算という小学校で習うものすら、その全てを理解していない。だから面白い。私にとって、「生きる」とは考える事であり、興味深い題材を考える時に幸せを感じます。

テーマ : 文明・文化&思想
ジャンル : 学問・文化・芸術

C#文法リファレンス - 多岐分岐( switch )

概要
 基準となる変数の値を元に、実行する処理を決定します。

日常でたとえると
 信号機には、赤・青・緑の3つの色があり、その色により通行の有無が決まっています。

使用に適した状況
 一つの値を基準に、実行する処理が変化する場合。ただし、多岐分岐を無暗に使うのではなく、オブジェクトの多態性により解決できないか、よく検討しましょう。

サンプル

/*----------------------------------------------------
 * 
 *  多岐分岐( switch )
 *  
 ----------------------------------------------------*/
using System;
class Sample
{
    static void Main()
    {
        int i = 2;

        //整数型もしくは文字列型の式を指定する
        //C#はbreakを省略する明示的な落下をサポートしていない
        //caseの最後には必ず何らかのジャンプ文を使わねばならない
        switch ( i ) {
            case 0:
                Console.WriteLine( "値は0" );
                break;
            case 1:
                Console.WriteLine( "値は1" );
                break;
            case 2:
                Console.WriteLine( "値は2" );
                break;
        }
        string str = "A";
        switch ( str ) {
            default: //defaultの位置はどこでもいい
                Console.WriteLine( "それ以外の文字" );
                break;
            case "A":
                Console.WriteLine( "文字列はA" );
                break;
            case "B":
                Console.WriteLine( "文字列はB" );
                break;
        }

        //自由落下したい場合はgoto文を使用する
        i = 0;
        switch ( i ) {
            case 0:
                Console.WriteLine( "値は0" );
                goto case 1;
            case 1:
                Console.WriteLine( "値は1" );
                goto case 2;
            case 2:
                Console.WriteLine( "値は2" );
                goto default;
            default:
                Console.WriteLine( "defaultが実行された" );
                break;
        }

        //終了
        Console.ReadLine( );
    }
}


文法
 switchキーワード、基準となる変数(丸括弧で囲む)、処理本体(波括弧で囲む)の3つの要素から成ります。処理本体内には、caseキーワードと値と:(コロン)を記述し、その値に時に実行する処理を指定します。
 実行する処理の最後には必ず、このスコープを抜ける命令を書きます。スコープを脱出する命令は通常、breakキーワードを指定します。
 なお、基準となる値が無数にあり、「その他の場合」を指定したいときは、defaultキーワードを使用します。caseキーワードとdefaultキーワードの順番は任意ですが、最後に書いた方が無難です。

解説
 プログラミングは変数の値に基づき処理をしたい場合が多々あります。そうした場合に使用するの文法が多岐分岐です。多岐分岐を使用すると、実行時の処理を柔軟に変更できます。
 ただし、C#はオブジェクト指向言語であることを忘れないでください。多岐分岐よりも、オブジェクトの多態性を利用したほうが良い場面も多々あります。もちろん、何でもオブジェクトで済ますのもまた害になります。そのバランスについては、経験を積むしかありません。
 C言語の技法に、自由落下(フリーフォール)というものがあります。自由落下は、基準となる値を元に、他の値のときに実行する処理も連続して実行することを指します。これは、caseの後に指定する処理の最後に、スコープ脱出命令を書かない形式ともいえます。なお、自由落下は明示的な落下(フォールスルー)とも呼ばれますが、ただの書き忘れの場合もあるので、明示的という部分に引っ掛かりを感じ私個人はこの名称を使っていません。
 この技法は便利な反面、エラーの元になりがちなので、C#では基本的に禁止されています。そして、caseごとに脱出する命令を記述するようになっています。もし、自由落下をしたい場合は、goto文を使用します。しかし、これはあくまでも他に手段がないときに使用する方法であり、混乱とエラーの元なので、極力goto文を使用しない方が良いでしょう。

テーマ : プログラミング
ジャンル : コンピュータ

ネタつつき169 - なぜ日本人は騙されやすいのか

 常日頃、ニュースを見聞きしていて、日本人は何故こんなに騙されやすいのかと思ったことはありませんか?私はよくそう思うので、そのことについて考えてみました。結論から言いますと、「論理的に考えず、よく人の話を聞かないから。」だと考えています。これから理由を書きます。
 ワイドショーでもネットでも、結構な数の日本人は、話し手を疑うことなく、一番最初に聞いた話を、たとえ嘘でも信じこんでしまいます。それが、誰かを傷つける結果になってもです。誹謗中傷の類や、犯罪者の言い訳に関して、その手の悪い人の意見を信じ込んでしまう人すら多々見かけます。
 例えば、ネットで何かを間違っているなどと騒いだら、その人が間違っている可能性も考えずに一緒に騒ぐ人が多いです。また、「騙された方が悪い」、「苛められた人が悪い」などといった犯罪者の言い訳をうのみにして、被害者の方を責める人が結構います。
 ちょっと論理的に考えると、間違っていると騒ぐ人自体が間違っている可能性もあると分かりますし、犯罪者の言い訳を鵜呑みにして、被害者の方を責めるならば、犯罪者にとって有利になり、犯罪行為がやりやすくなる結果を招くことがすぐにわかります。また、ワイドショーに関しても、本人の話しを聞かずに判断するのはおかしいと分かります。
 こういった事態はよくあります。「選んだ国民が悪い」という論調がありますが、それを真とするならば、選挙に行く行為自体ができません。何故ならば、その人が嘘をついている可能性、将来約束を守らない可能性、党がその人の意見を無視する可能性があるからです。それを考慮すると、最善手は「エスパーではないから誰も選ばない」になってしまいます。それにもかかわらず、「選挙に行かない人が悪い」などという論調も同時にあります。超能力を要求しておいて、選挙で投票しないのが悪いという命題は、日本人は全て超能力者であり、その能力を使わないのは悪いとするしか真になりません。非論理の極みです。そうした、非理論的な発言が日本社会でまかり通っています。
 これらのケースを見てわかると思いますが、会話と思考が欠如しています。一般大衆の見本となるべき、プロを自称するマスメディアですら、主語がわからない事を自慢すらしています。悪意から出た偽装やねつ造の類だと思いますが、もし本気ならば、主語がわからないのがプロの報道マンであることになります。プロを自称する人たちですらこうなのですから、不思議でなりません。この異常な現象は、日本そのもののを劣化させていると思えてなりません。
 残念ながら日本人は、論理的思考能力と会話能力が低いと言わざるを得ません。むろん、論理的思考能力とコミュニケーション能力が高い人もいますが、非理論的な雑誌が実際に売れ、詐欺事件が横行し、被害者を責める風潮がある現状を鑑みると、そう結論せざるを得ません。非理論的に低い会話能力で誰かを苦しめれば、結局その人も誰かから騙されるのです。それに、非理論的さが招く犯罪への対処の甘さが、日本を破滅へと導いています。日本は既に末期状態なので、日本社会全体の論理的思考能力と会話能力が高まることを願っています。

テーマ : 文明・文化&思想
ジャンル : 学問・文化・芸術

C#文法リファレンス - 仮想メソッドとオーバーライド

概要
 親クラスが持つ振る舞いを上書きして、子クラス特有の振る舞いを実現できます。オブジェクト指向プログラミングの概念である多態性を、実現するのに使用される文法です。

日常でたとえると
 鳥の飛び方はいろいろです。親と子のライフスタイルは別物です。

使用に適した状況
 大まかには同じで、細部は違う処理をしたいとき。振る舞いを抽象化して扱いたい場合。

サンプル

/*----------------------------------------------------
 * 
 *  仮想メソッドと再定義(オーバーライド)
 *  
 ----------------------------------------------------*/
using System;

class Parent
{
    //【仮想メソッド】
    //子クラスで再定義できる事をvirtualキーワードで示す
    public virtual void OutPut()
    {
        Console.WriteLine( "親クラスのメソッド" );
    }

    public virtual void NewMethod()
    {
        Console.WriteLine( "親クラスのメソッド" );
    }
}

class Child : Parent
{
    //親クラスのメソッドを再定義する事をoverrideキーワードで示す
    public override void OutPut()
    {
        // 呼び出さなくてもOKだが、通常は呼び出す。
        base.OutPut( );
        Console.WriteLine( "子クラスのメソッド" );
    }

    //アクセス修飾子は変更できない
    //protected override void OutPut()
    //{
    //    base.OutPut();
    //}

    public override void NewMethod()
    {
        Console.WriteLine( "子クラスのメソッド" );
    }
}

class Override
{
    static void Main()
    {
        //親クラスのメソッドも呼び出される
        Child obj = new Child( );
        Console.WriteLine( "オーバーライドされたメソッドを呼び出します・・・" );
        obj.OutPut( );
        Console.WriteLine( );

        //子クラスのメソッドだけを呼び出す
        Console.WriteLine( "子クラスのメソッドだけ呼び出します・・・" );
        obj.NewMethod( );
        Console.WriteLine( );

        //親クラスのメソッドの呼び出しを試みる
        Console.WriteLine( "親クラスのメソッドの呼び出しを試みます・・・" );
        obj.NewMethod( ); //これでは親クラスのメソッドが呼び出されない
        Console.WriteLine( "失敗!キャストして試みます・・・" );
        ( ( Parent ) obj ).NewMethod( ); //隠蔽されたメソッドなのでキャストすると呼べる
        Console.WriteLine( );

        //終了
        Console.ReadLine( );
    }
}


文法
 仮想メソッドとオーバーライドは一緒に使用します。親クラスの方でvirtual修飾子を付けたメソッドを宣言すると、それは仮想メソッドとなります。子クラスは、その親クラスが定義した仮想メソッドをオーバーライドして、処理の内容を変更できます。
 オーバーライドは、親の仮想メソッドをoverride修飾子をつけることにより定義します。virtual修飾子はつけないので、修飾子を書き換えたものと思えば覚えやすいです。

解説
 オブジェクト指向プログラミングには、多態性という概念があります。多態性というのは、同じ指示でも、個々のクラスが異なる振る舞いをすることです。例えば、多くの鳥は飛びます。従って、オブジェクトで表現すると、鳥オブジェクトおよびその子は、「飛ぶ」という振る舞い(メソッド)を持つことが期待されます。この場合、「飛ぶ」という指示を与えば、それぞれがふさわしい方法で実行します。
 このような機能がある理由は、個々のオブジェクトが持つデータが異なるからです。同じ内容の振る舞いでも、持つデータが違えば、処理の細部は変わります。もし、これらの振る舞いを統一して扱う方法がなければ、クラスごとに違うメソッドを呼ばねばならず、プログラムを再利用することが不可能になってしまいます。
 そうしたことから、同じ名前で詳細が異なるメソッドを定義する方法が用意されています。同名という点では、多重定義(オーバーロード)がありますが、多重定義(オーバーロード)とは違う概念なので注意してください。多重定義(オーバーロード)は主に単一のクラスレベルで考える事柄であり、オーバーライドは親子の継承関係で考える事柄です。
 オーバーライドを使用する際は設計レベルで考える必要があります。もし、十分に考えずに使用すると、プログラムの挙動が予測できず、予想できないバグが発生する結果をもたらします。オーバーライドは、親の振る舞いを上書きしますが、期待する事柄が同じ場合に使用します。もし、親子で全く違う処理内容ならば、別の名前でメソッドを定義したほうが良いでしょうし、そもそもそれらオブジェクト間に親子関係がない可能性があります。

テーマ : プログラミング
ジャンル : コンピュータ

C#文法リファレンス - 多重定義(オーバーロード)

概要
 パラメーターだけが違う同じ内容のメソッドに対して、同じ名前を付けられます。

日常でたとえると
 細かいことを気にしないときは、車を使って通勤する、電車を使って通勤する、自転車を使って通勤する、…これらを合わして通勤と表現する。

使用に適した状況
 同じ内容で、受け取るパラメーターが違う、メソッドやコンストラクタなどがある場合に使用します。

サンプル

/*----------------------------------------------------
 * 
 *  多重定義(オーバーロード)
 *  
 ----------------------------------------------------*/
using System;

class Foo
{
    public void Method( int i )
    { Console.WriteLine( "私はint型の値を受け取るメソッドです。" );  }

    //戻り値の型のみ違うオーバーロードは出来ない
    //public int Method( int i ) { return 0;  } 

    //refだけ違うオーバーロードも可能
    public void Method( ref int i )
    { Console.WriteLine( "私はrefキーワード付き、int型の値を受け取るメソッドです。" ); }

    //outとrefは共存できない
    //public void Method( out int i )
    //{ 
    //    i = 10;  
    //    Console.WriteLine( "私はoutキーワード付き、int型の値を受け取るメソッドです。" );
    //}

    //パラメーターの数が違うのは別物
    public void Method( int i, int y )
    { Console.WriteLine( "私はint型の値を2つ受け取るメソッドです。" ); }

    //似ている型でもOK
    public void Method( long i )
    { Console.WriteLine( "私はlong型の値を受け取るメソッドです。" );  }
}

class Sample
{
    static void Main()
    {
        //各種オーバーロードメソッドを呼び出す
        int i = 0;
        Foo obj = new Foo( );
        obj.Method( i );
        obj.Method( ref i );
        obj.Method( i, i );
        obj.Method( ( long ) i );

        //終了
        Console.ReadLine( );
    }
}


文法
 厳密にいうと今回紹介した文法はメソッドのオーバーロードです。オーバーロードとだけ書かれている場合、通常はメソッドのオーバーロードを指します。コンストラクタと演算子にもオーバーロードを定義できます。

解説
 振る舞い(実行する内容)は同じで、パラメーターの型だけが違うメソッドを多数用意したい場合があります。例えば、足し算の引数は複数の整数型(int、longなど)を必要としています。
 もし、そうしたパラメーターの方だけが違う、同じ振る舞いを持つメソッドに対して、同じ行重がつけられなければ、AddInt、AddLongという具合に、パラメーターの型を記述した変な名前などにしなければなりません。他にも命名法は考えられますが、いちいち命名法を考えるよりも、同じ名前にするのが最善です。
 これは些細なことだと思われるでしょうが、人間がプログラムを読み書きするとき、名前は非常に大切です。何故ならば、適切な名前は内容も表わすからです。適切な名前が命名されているプログラムは、非常に読みやすく覚えやすいので、人間の作業スピードが上がるからです。
 ただし、型変換が伴うと、どのメソッドが実行されるかの予測が困難になる場合があります。また、仕様が違うメソッドに対して、オーバーロードを使用するのは大きな間違いです。十分に注意しましょう。

テーマ : プログラミング
ジャンル : コンピュータ

C#文法リファレンス - 外部関数呼び出し

概要
 C言語で作られた関数を呼び出します。主にWin32APIを使用する目的で使用します。

日常でたとえると
 今時風の名前を命名して、古い機械を操作する。

使用に適した状況
 WindowsOSの機能を使用したい場合。過去の資産を使用したい場合。

サンプル

/*----------------------------------------------------
 * 
 *  C言語の関数を呼び出す
 *  
 ----------------------------------------------------*/
using System;

class Sample
{
    //C言語で作られたDLLに存在するメッセージボックス
    [System.Runtime.InteropServices.DllImport( "user32" )]
    static extern int MessageBox(
       int hWnd,
       string pText,
       string pCaption,
       int uType );

    static void Main()
    {
        Console.WriteLine( "C言語のライブラリを呼び出します・・・" );
        string pText = "Win32のメッセージボックス";
        string pCaption = "Test";
        MessageBox( 0, pText, pCaption, 0 );
        Console.WriteLine( );
        Console.ReadLine( );
    }
}


文法
 extern修飾子を指定した専用のメソッドを用意し、System.Runtime.InteropServices.DllImport属性を適用します。属性のコンストラクタには、ライブラリの名前を指定します。
 extern修飾子は外部で実装されていることを示します。ですから、メソッドの本体は何も記述しません。

解説
 .NETライブラリは機能が豊富で、大概の事はできます。しかしプログラミングをしていると、どうしてもWindowsOSの機能を使いたい状況があります。そういったときに、この属性を使用して、APIを呼び出すとによりOSの機能を使用します。
 また、C言語で実装した古い資産がある場合もあります。古い資産をC#で書き直せればいいのですが、それができない場合もあります。具体的には、会社が提供しているライブラリ商品は、ソースコードが提供されていない上に、知的財産の侵害にならないようにせねばなりませんので、新しいヴァージョンが提供されていない場合は、この属性を使用するしかありません。
 異なる環境のものを使用するのは危険を伴います。この文法を使うのは極力避けるべきです。

テーマ : プログラミング
ジャンル : コンピュータ

C#文法リファレンス - 例外処理

概要
 メソッドが守るべき仕様(約束)が果たせないときに、呼び出し側にその旨を伝えます。

日常でたとえると
 仕事でトラブル発生したら、上司や同僚に相談する。サービスの範囲外の注文をされた時、その旨を丁寧にお客様に伝える。プログラムでも報連相は大事なのです。

使用に適した状況
 パラメーターとして渡された値が、対応できないものである場合。実行を継続できない環境になった場合。…などです。例外処理は、メソッドの仕様を表わすものと考えると分かりやすいでしょう。

サンプル

/*----------------------------------------------------
 * 
 *  例外処理
 *  
 ----------------------------------------------------*/
using System;

//独自の例外はExceptionを継承する
class TestException : System.Exception { }

//例外をスローするクラス
class Foo
{
    public static void ExceptionMethod()
    {
        throw new TestException( );
    }
}

//例外を再スローするクラス
class Bar
{
    public static void ExceptionMethod()
    {
        try {
            Foo.ExceptionMethod( );
        } catch {
            Console.WriteLine( "再度例外をスロー" );
            throw; //再度スロー
        }
    }
}

class Sample
{
    static void Main()
    {
        //例外が発生する可能性があり対処できるならばtryで囲む
        try {
            Foo.ExceptionMethod( );
        } catch ( TestException e ) { //例外を捕捉
            Console.WriteLine( "例外をキャッチしました" );
            Console.WriteLine( e.StackTrace );
            Console.WriteLine( );
        } finally {
            Console.WriteLine( "finallyブロックは必ず実行されます" );
            Console.WriteLine( );
        }

        //再度スローされた例外を捕捉する
        try {
            Bar.ExceptionMethod( );
        } catch ( TestException e ) { //例外を捕捉
            Console.WriteLine( "例外をキャッチしました" );
            Console.WriteLine( e.StackTrace );
            Console.WriteLine( );
        } catch {
            //他の例外を捕捉する
            throw;
        }
    }
}


文法
 例外処理は情報を発信する側と、受け取る側に分けて考えます。受け取る側の例外処理は、三つの要素から成り立ちます。一、例外の発生が予想でき、なおかつ対応もできるプログラム群に対して「try」キーワードを指定し、コードブロック(波括弧)で囲みます。二、対処する例外を「catch」キーワードと例外処理の型(丸括弧で囲む)で指定し、コードブロック内に対処用プログラムを書きます。三、「finally」キーワードを指定し、例外処理の発生有無に関係なく実行する処理を、コードブロック内に記述します。
 例外処理(問題に関する情報)を発信する側は、System.Exception型を継承して実装する、オリジナルの例外型もしくは、ライブラリに予め用意されている例外型(System.Exception型から派生している型)を、「throw」キーワードを使用してスローします。

解説
 通常仕様はドキュメントに書きます。ですが、プログラムを使って仕様を表現することもできます。例外処理はそのために存在します。
 あまり意識されていませんが、メソッド(プログラム群)には実行できる前提条件が存在します。例えば、整数型の除算命令を使用するメソッドは、割る数が0のとき、プログラムの実行を継続することができません。そういった、前提をチェックし、何がいけなかったのかを呼び出し側、しいてはプログラマーに知らせます。もちろん、前提条件だけチェックすればいいというものではなく、処理途中でも必要ならばチェックします。
 例外処理がない言語は、戻り値でエラーを表現していました。しかしながら、戻り値を返す方法は、問題に関する情報が少なく不便でした。また、集団で作業する場合において、個人々が考えて戻り値を決めるものですから、エラー処理の不統一になり、非常に開発と保守がやりにくい状態でした。そうした問題を解決するために考え出されたのが、例外処理です。例外処理を使用すると、統一された方法でエラーに対処できます。
 例外処理という名前は、「予想外」な状態だとか、発生頻度を連想させますが、実際はそういう事はありません。予測可能性だとか頻度とは関係なく、メソッドが守るべき仕様を満たせないときに例外処理を使用します。
 他にも書きたいことが山ほどありますが、残念ながら例外処理に関する詳しい事柄は、リファレンスに書けません。例外処理に関する詳細な情報は、プログラミング.NET Frameworkを参考にするとよいと思います。

テーマ : プログラミング
ジャンル : コンピュータ

C#文法リファレンス - 後判定繰り返し処理(do-while)

概要
 指定した条件を満たす間、繰り返し指定された処理を実行します。

日常でたとえると
 80点以上取れるようになるまで問題集で勉強する。勤務時間が終わるまで仕事をする。など、ある条件を満たしている間、同じ行為をすることはよくあります。

使用に適した状況
 必ず1回は処理を実行したい場合に使用します。

サンプル

/*----------------------------------------------------
 * 
 *  後判定繰り返し処理/反復処理( do-while )
 *  
 ----------------------------------------------------*/
using System;
class PretestLoop
{
    static void Main()
    {
        //指定した式が条件を満たさなくなるまで処理を繰り返す
        int i = 0;
        do {
            //~10を表示
            Console.Write( i.ToString( ) + " " );
            ++i;
        } while ( i < 10 );
        Console.Write( System.Environment.NewLine );

        //無限ループ
        Console.WriteLine( "無限ループを実行します" );
        do { } while ( true );
    }
}


文法
 「do」キーワード、実行する処理(波括弧で囲む)、「while」キーワード、終了条件(丸括弧で囲む)の順に指定します。終了条件は、より正確に書くと、処理を続ける条件です。

解説
 プログラミングをしているとたまに、1回は必ず実行させたい繰り返し処理が必要となるときがあります。意外に思われるかもしれませんが、実のところ、あまりそういう状況はありません。何故ならば、大概の処理は実行せずに済ませられる場合が多くいからです。また、処理を効率化するために、実行をしないで済むように設計するのが基本だからです。それ故に、熟練者はdo-whileが使用されていると、慎重にdo-whileを使用している理由を探ります。
 do-whileよりもwhileを使用する機会が多いでしょう。ですが、それだけにdo-whileを使用すると、読み手に注意を促すことができます。適切な状況で注意深く使用しましょう。そうすれば、貴方のコードはより美しくなります。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター