ChaichanPapa-World !

燈明日記(2004/02

◆ インデックス

◆ 2004年2月

2004/02/18(水)Javaコーディング規約

Javaでは、暗黙のコーディング規約あり、クラス名は大文字始まりとか、メソッドは小文字の動詞始まりとか決まっています。(文法的には決まっていない)

このような規約は、Javaのスローガン "Write Once, Run Anywhere" の精神にのっとり、是非、守っていきたいと思います。

どこぞの会社でcobolでのコーディング規則をJavaに適用して撃沈したという噂を聞きました。

Javaコーディング規約のリンクメモです。

2004/02/18(水)インターフェイスと抽象クラス

インターフェイスと抽象クラスをまとめてみました。

Javaで云うインターフェイスとは、実装がないメソッドの集まりです。 (しかし、フィールド、クラス、インタフェースを含むことができる)

コーディング例:

public interface Kodomo {
    /**
     * タオルを持ってくる
    **/
    public void comingup();
}

抽象クラスとは、実装がないメソッドを1つ以上含むクラスです。

コーディング例:

abstract public class Kodomo {
    /**
     * タオルを持ってくる
    **/
    abstract public void comingup();
    public void bakaoyaji_print(){
           System.out.println("馬鹿オヤジ、またかよ!");
    }
}

で、何がインターフェイスと抽象クラスで違うかというと、大きく分けて2つあります。

  1. 継承に関して、インターフェイスは複数継承ができ、抽象クラスは一つしか継承できない。
  2. メソッドに関して、インターフェイスは抽象メソッドだけで、抽象クラスは具象メソッドもOKです。

では、実際どのように使い分けるかというと。 抽象クラスは、親子関係のある子クラス達の共通役割(内容ではない)を定義するとき。 インターフェイスは、親子関係にかかわらず、共通役割(内容ではない)を定義するとき。

インターフェイスに関しては、パソコンのUSBコネクトをイメージすると分かり易いかも。 USB(インターフェイス)のあるパソコン(オブジェクト)には、 すべてのUSB機器(他のインターフェイス持つオブジェクト)をつな繋ぐ(代入)ことができる。

2004/02/17(火)プロローグ for オブジェクト脳

ご挨拶

去年(2003年)の暮れから、『オブジェクト指向』を勉強してきましたが、とりあえず、インプットは完了しました。

これからは、アウトプットを徐々にして行きますので、宜しくお付合いお願い致します。

尚、以下のプログラムソースは、本:著者 牛尾 剛氏『オブジェクト脳のつくり方』を大変参考にしています。

私の拙い説明で分からない時は、是非、この本を購入して勉強してみてください。超おすすめです。

イントロダクション

COBOL,C,VB,Perl等のプログラム言語習得は、なんのカルチャーショックも無しに比較的容易にできますが……。 JAVAは違う、全然分からない、勉強しても分かった気がしない……。 しかし、『COBOL,C,VB,Perl等を知らない自分なんか、そんなJAVAは、無理や〜!!』と思わないで下さい。 プログラミングに固定概念がないあなたこそが、なまじC言語等を知っている人より、 マスターできる可能性があるのです。 事実、私は、固定概念があるため、大変苦労しています。

さて、JAVAは、なぜ、全然分からないのか?

答え:それは、『オブジェクト指向が分からないので、分かった気が全然しない』ということが、最近分かってきました。

COBOL,C,VB,Perl等のプログラム言語は、手続き型言語と云って、マシンに対して、 やりたい処理をフラットに記述して実現します。 それに対して、Javaは、オブジェクト指向型言語と云って、マシンなど意識ぜず、 やりたい処理を再利用を考慮して細分化し、細分化した小さな処理の組み合わせで、実現します。

細分化は、機能での細分化ではなく、役割での細分化とします。 そして、役割を演じるモノがオブジェクトとなります。 おぉ、分かったような、分からないような……。 とりあえず、能書きはこのぐらいにして、お題です。 おっと、そのまえに予備知識。

予備知識

[オブジェクト指向]

ソフトウェアの内部処理については考えずに、『対象となる実世界について考えよう』という指向。

そして、考えたモノを部品化して、その組み合わせで新たなプログラムを作りましょうという指向。

[オブジェクト]

考えて部品化したモノをオブジェクトという。 オブジェクトは、アイデンティティーがあり、同種の他のものと区別することができる。そしてそこにはどの点で違うかという「属性 」と、どの点で同種だと言えるかという「クラス」がある。 Javaでのオブジェクトとは、メソッドとプロパティからなり、クラスがインスタンス化したもの、Javaプログラムそのもの。

[クラス]

オブジェクトの元になるもの。要は、C言語で云うと、構造体そのもの宣言がクラスで、構造体型変数の宣言がオブジェクトみたいな 感じ。

[メソッド]

C言語で云う関数のようなもの。

[プロパティ]

C言語で云う変数のようなもの。尚、 プロパティ以外に、フィールドとも呼ばれる。

[プログラム]

Javaに関しては、クラス又はオブジェクトのどちらか。

[カプセル化]

オブジェクトの中身を隠し、直接アクセスを禁止して、メソッドを介して、アクセスしてもらうこと。

[継承]

すでに定義済みのクラス(親クラス)のメソッドとプロパティを引き継いだ新しいクラス(子クラス)を作ること。

[オーバーライド]

継承は、単に親クラスの機能引継ぎですが、そこに子クラスなりの機能で置きかえること。

お題

以下のNingenクラスへ新規メソッド:見る『miru』を追加してみましょう。

/**
 * 人間を表すクラス
**/
public class Ningen{
    private String name; // 名前
    private int shincho; // 身長
    /**
     * 人間に魂を入れるコンストラクタ
     * @param name 名前
     * @param shincho 身長
    **/
    public Ningen(String name, int shincho) {
        this.name = name;
        this.shincho = shincho;
    }
    /**
     * 食べる
    **/
    public void taberu(){
        System.out.println(name + "は、沢山食べて、身長が" + shincho + "cm になりました。");
    }
    /**
     * 寝る
    **/
    public void neru(){
        System.out.println("身長:"+shincho + "cm の" + name + "は、寝るのが好き。");
    }
} 

/**
 * 人間に指示するマネージャクラス
**/
public class Manager {
    public static void main(String[] args) {  // Javaのお約束
      Ningen ningen = new Ningen("ひろ", 173);// 人間クラスに魂を注入し、人間オブジェクト誕生
             ningen.taberu();                 // 人間オブジェクトへ食べろと命令
             ningen.neru();                   // 人間オブジェクトへ寝ろと命令
    }
}
ソース説明
public class Ningen{〜} - パブリックなクラスNingen。
private String name; - プライベートな文字列型の変数name。
private int shincho; - プライベートな整数型の変数shincho。
this - thisが使われてるクラス自身そのものを指す。
public void taberu() - パブリックなリターン値のないメソッドtaberu。
System.out.println() - 画面に文字列を表示する。
public static void main() - パブリックで静的でリターン値のないメソッドmain。
/*〜〜〜〜*/は、ソースのコメント。

2004/02/17(火)例題 for オブジェクト脳

例題:『子供』がタオルを持ってくる

場面設定:

とある『父親』の『子供』は、『長男』と『次男』の2人でした。 『父親』は、お風呂に入るときにいつも、タオルを忘れます。 『父親』は、いつもお風呂からドア越しに、『子供』へタオルを持って来てと叫びます。 すると、とにかく、『子供』がタオルを持ってきてくれます。いい子やね。

オブジェクトの洗出し:

オブジェクト指向では、現実社会をシミュレートする指向ですから、オブジェクトは以下の様になります。

しかし、子供オブジェクトは、実は次男オブジェクト或いは長男オブジェクトを抽象化(次男も長男も子供)したものです。 このようなものは、まず、インターフェイスとしましょう。 そして、インターフェイスには、今回は『タオルを持ってくる』というメソッドの宣言のみ定義します。

/**
 * 子供を表すインターフェイス
**/
public interface Kodomo {
    /**
     * タオルを持ってくる
    **/
    public void comingup();
}

つぎに、次男オブジェクトと長男オブジェクトは、子供インターフェイを継承して、 『タオルを持ってくる』というメソッドを実装します。

/**
 * 次男を表すクラス
**/
public class Jinan implements Kodomo { // 次男は子供でもあります

    public void comingup(){
        System.out.println("次男がすぐタオルをもってくる。");
    }
}
/**
 * 長男を表すクラス
**/
public class Chounan implements Kodomo { // 長男も子供なので、継承してます

    public void comingup(){
        System.out.println("長男が嫌々タオルをもってくる。");
    }
}

さて、父親クラスの、kodomo.comingup();ですが、子供オブジェクトに対して発行しています。 そして、子供オブジェクトへインスタンスしたクラスが『次男』のときは、次男オブジェクトのcomingup();が起動され、 『長男』のときは、長男オブジェクトのcomingup();が起動されます。 このように、kodomo.comingup();が一つにもかかわらず、ケースByケースで違うオブジェクトのcomingup();が起動されることを ポリモーフィズム(多相)といいます。

/**
 * 父親を表すクラス。子供へタオルを持ってきてもらいます。
**/
public class Chichioya {
    public static void main(String[] args) {

        Kodomo kodomo = null;

        if(args[0].equals("Chounan")) { // args[0]は1つめの引数
            kodomo = new Chounan();     // 長男を子供に代入できる
        }
        if(args[0].equals("Jinan")) {
            kodomo = new Jinan();       // 同じく次男を子供に代入できる
        }
        kodomo.comingup(); // 次男だろうが長男だろうが1つのコードでOK
    }
}

今回の超ポイント:

次男オブジェクトと長男オブジェクトの共通部分であるcomingup();を、子供クラスに定義して抽象化しました。 つまり、子供インターフェイスではcomingup();の宣言のみで、実装は各々次男クラスと長男クラスで行いました。

一方、父親オブジェクトでは、子供オブジェクトに対してのみ処理をしており、次男オブジェクトと長男オブジェクトの実装をまった く関知していません。

このように、インターフェイスを使うことにより、オブジェクト同士の結びつきを弱くし、オブジェクトの独立性を高めます。 つまり、オブジェクトの部品化が促進されるわけです。

尚、抽象化に関しては、インターフェイスの他に、まさにそのもの抽象クラスがあります。

オブジェクト脳(何)とは、ずばり、インターフェイスと抽象クラスを使いこなして、オブジェクト同士の結びつきを弱くし、クラス の独立性を高め、部品化の促進を考えることができることだと思います。

2004/02/16(月)オブジェクト脳

どうやら、オブジェクト脳が芽生えたらしい……、前回、挫折した『オブジェクト脳のつくり方』が分かるようになった!

これは、明らかに結城さんの『デザインパターン入門』お蔭様だ。

とりあえず、オブジェクト脳系のリンクのメモ。

上のプレゼン資料は、2月21日の『オブジェクト指向 With Java』勉強会(弊社のちゃいちゃんパパ独り善がり勉強会)で使えそうだ。ラッキー!牛尾さん、ありがとう。

しかし、ただで(無料で)これだけの資料を公開して後悔しないなんて、牛尾さんは、太っ腹や!

2004/02/15(日)涅槃会

今日の涅槃会は、無事終了しました。

涅槃会の意味については、『ブッタの最期』を参照して下さい。

2004/02/14(土)グーグルツールバー for バレンタインデー

今、ブラウザを立ち上げたら、グーグルツールバーの検索欄に『染み』があって、ウィルスにやられたかと思ったら、よく見るとハートの形をしている。

また、ロゴや検索ボタンもハートや!

もしかして、今日は、バレンタインデー!!


私には、全く、縁の無い日です……。とほほ。

2004/02/13(金)3つ一組のキーワードで、オブジェクト指向の謎を解く

オブジェクト指向を勉強していると、3つが一組のキーワードが沢山登場します。

  1. データ
  2. 手続き
  3. メッセージ送受信機能
  1. これが何からできているのか
  2. これと似たようなものがあるか
  3. これでどんなことができるのか
  1. 属性
  2. 内包
  3. 外延
  1. あるオブジェクトを何で構成するのか,何を隠蔽するのかというような(has-a)
  2. 多くのオブジェクトの関係を考えるインヘリタンスの視点(is-a)
  3. オブジェクト間の統一的なコミュニケーション
  1. 換喩
  2. 提喩
  3. 隠喩
  1. 構造主義
  2. 機能主義
  3. 事象主義
  1. 実体と関係に着目する技術
  2. 情報の流れに着目する技術
  3. 事象と状態に着目する技術
  1. データ構造をモデル化
  2. 機能役割をモデル化
  3. 計算過程をモデル化
  1. 構造
  2. 機能
  3. 事態
  1. 抽象データ型(オブジェクト)
  2. インヘリタンス(継承)
  3. ポリモルフィズム(多相)

つづきは、徐々に……、早く知りたければ、昨日紹介したページへ。

しかし、そのページは、1992年のコンテンツなのに、全然古さを感じない、凄い!

2004/02/12(木)見切った!!『オブジェクト指向』

結城さんの『デザインパターン入門』全読と、以下のページで『オブジェクト指向』がかなり見えて来た!

このページは、本当に凄い、はじめて『オブジェクト指向』が分かったって感じがしました。

2004/02/11(水)U言語

テキストでクラス図を書く時に使えそうだ。メモメモ。

2004/02/10(火)Java-URL

とりあえず、オブジェクト指向系リンクのメモ。

近いうちリンクを整理します。結構デザインパターン系を集めてみました。

2004/02/09(月)30分早出出勤

今日から『とある後輩』の遅刻をなんとかしようと、みんなで30分早く出勤して、勉強をすることにした。

しかし、その後輩だけがこなかった……。オイ!

と云うことで、明日も30分早く出勤するので、もう寝ます。おやすみなさい。


当分、まとまった更新ができそうもないなぁ……。

2004/02/07(土)匿名クラス

何年かぶりに『アプレットなJavaの基礎講座』を追加更新しました。

最近、抽象クラスとかインターフェイスが分かってきたので、匿名クラスが理解できました。

2004/02/06(金)疲れた

今日は、めずらしく根詰めて仕事をしてしまって、疲れた。

本当は、『JAVAの匿名クラスについて』をアップしたいのだけど次回に……

ということで、とっとと寝ます。おやすみなさい。

2004/02/05(木)3分で理解する Blog

メモ

流れはBlogかな……。でも、燈明日記は当分今の感じです。

2004/02/05(木)雑記

正しい宗教も、やり過ぎ、のめり過ぎは、カルトと同じや、斉家が目標なのに逆の家族崩壊へ……ほどほどに、誰にともなく。


今、会社でローカルなML(メーリングリスト)は流行っている、いや、流行らせている。C言語勉強MLとJAVA勉強MLの2つ。私はこれに掛けてみる(謎)。


『オブジェクト指向 with Java』の勉強会も今月から再スタートするよ。 しかし、よく理解していないJavaを人に教えるのは、ハッタリ噛ますしかないか……。いやいや、日夜勉強あるのみや……。

2004/02/03(火)親バカ日記更新

すこし更新しました。ぢみにやつてゐます。

2004/02/02(月)多忙

仕事に火がついた。ぢみにやつてゐます。

2004/02/01(日)3つの実践

今日、某教会で、鬼は外・福は内の『節分会』のイベントがありました。

そこで、教会長さんから『鬼は外』の心の鬼を追い払うには、3つの実践をしていきましょう...と云うご指導がありました。

  1. 人と会ったら、挨拶する。
  2. 呼ばれたら、ハイと返事をする。
  3. 靴を脱いだら揃え、席を立ったら椅子を机に入れる。

1の挨拶をすることは、相手に敬意をはらう行いで、仏教的には相手の仏性を拝むこと、心に鬼がいたら出来ないことです。

2のハイと返事することは、相手の思いを汲む行いで、これもまた、心に鬼がいたら出来ないことです。

3の揃えることは、後を省みる行いで、人は、常に反省や内省が大切、これもまた、心に鬼がいたら出来ないことです。


そう、まさに『当たり前のことを当たり前にすることが大事』の実践ですね。

あなたも、心に鬼がいたら出来ないこの3つを実践を行い、鬼のいない心を保って行きましょう。

それが、きっと『福は内』へのパスポートになることを確信しております。