Iterator なんて好例だと思うけど、for 文で二重に回すのを三回使わないと全アイテムにアクセスできないような構造があったとして、それがプログラムに何回も出てくるとします。旧世代根性プログラマは、その for 文をまるごとコピーしまくるわけですよ。
で、後日データ構造の変更があると、コピーした所全部を変更しなきゃいけないわけで。いつバグが入ってもおかしくない殺伐としたコードになるわけです。
ここで、複雑な for 文を書くだけのクラスを作って、for 文一つで全てのアイテムをアクセスする。データ構造の変更があれば、コードを直すのは一箇所だけ。こういうインターフェイスと実装を分けるみたいな発想は、何人もの人間が一つのプログラムを書くみたいな現場向けのものだと思いますけど、どうでしょう。
言語の方でメモリ管理とかインターフェイスとかをサポートしてないと、使ってて嬉しくはないかもしれません。
C でインターフェイスと実装を分けるっていうとモジュール化とか、ヘッダで露出してる関数を利用する立場のコードが中で何をやってるかを知らないですむって感じだと思うけど、それを実現するだけでかなり手間がかかると思います。
一方、抽象クラスとしてのインターフェイスをサポートしてる言語の場合は、クラスそのものの役割をインターフェイスで記述することができるわけです。
Iterator i = bar.createIterator(); // createIterator() returns BarIterator
while (i.hasNext()) {
Foo foo = (Foo) i.getNext();
foo.doSomething();
} // while i
解説しよう (スコア:5, 参考になる)
Factory Method [srad.jp]
オブジェクトを作成するときのインターフェースだけを規定して、実際にどのクラスをインスタンス化するかはサブクラスが決定するようにする。
Singleton [srad.jp]
クラスが1つだけインスタンスを持つことを保証し、そのインスタンスにアクセスするためのグローバルな方法を提供する。
Adapter [srad.jp]
クラスのインターフェースを、クライアントが求める他のインターフェースに変換する。Adapterパターンは互換性がないインターフェースのために組み合わせることができないクラス同士を組み合わせることができるようにする。
Composite [srad.jp]
階層構造を表現するためにオブジェクトを木構造に組み立てる。Compositeパターンを利用することでクライアントは個々のオブジェクトとそのオブジェクトを合成したものを一様に扱うことができる。
Iterator [srad.jp]
集約オブジェクトの内部表現を公開せずに、その集約オブジェクトの要素を順にアクセスする方法を提供する。
Template Method [srad.jp]
ある処理においてアルゴリズムのスケルトンを定義し、その中のいくつかのステップはサブクラスでの定義に任せる。Template Methodパターンはアルゴリズムの構造を変化させることなしにアルゴリズム中のあるステップをサブクラスで再定義させる。
Flyweight [srad.jp]
多数の小さいオブジェクトを効率よくサポートするために共有を利用する。
T.Sawamoto でスパゲティ量産 [srad.jp]
T.Sawamoto [srad.jp]に聞いて下さい。
定番ですが。 (スコア:2, 参考になる)
Java言語で学ぶデザインパターン入門 (スコア:2, 参考になる)
複雑なパターンであればあるほど、なんで必要なのか分からないっていうは普通だと思うけど、 自分のコードで使ってみて初めて、「なるほど!」と突然パターンの意義が理解できるようになると思います。
Re:解説しよう (スコア:1, 興味深い)
なるほど。 (スコア:1)
Re:なるほど。 (スコア:0)
まだまだ (スコア:1)
クビになりにくくするための防御手段でもあります。
ただし、プロジェクト終わった瞬間に切られる危険が高い諸刃の剣。
--
Ath'r'onならfloatあたりに自信が持てます
Re:なるほど。 (スコア:0)
Re:解説しよう (スコア:1, おもしろおかしい)
俺はアホかー
Refactoring to Patterns (スコア:4, 参考になる)
先日飛行機に乗ったら隣に著者のJoshua Kerievskyが座っていて「俺の本を読め~」と薦められたのでした。
デザインパターンは重要であるけど、最初からパターンを追い求めて設計するとOver Designになって開発効率は落ちる。
かといって、何も考えずに開発するとUnder Designになって、やはり開発効率は落ちる。
リファクタリングしながらデザインパターンに揃えていくのがよろしい、というのがこの本の主張です。
こんなコードの時には、こういうリファクタリングをして、このパターンに持っていけ、みたいなシナリオがいろいろあって、自分のような実力の持ち主にも十分役にたちそうです。
---- 末は社長か懲戒免職 なかむらまさよし
Re:Refactoring to Patterns (スコア:1)
どういうきっかけで話し始めるんですか?
読んでる本とかノートPCの画面とか?
それとも欧米の人には「飛行機に乗ったら隣の人と雑談する」
という風習でもあるんでしょうか?
#最近フライト1時間の国内線しか乗ってないんです。
Re:Refactoring to Patterns (スコア:1)
ちなみにその飛行機はXP Agile Universe [xpuniverse.com]があったCalgaryからサンフランシスコへの戻りの便だったので、結構な人数のXP関係者が乗っていたのでした。
---- 末は社長か懲戒免職 なかむらまさよし
Re:Refactoring to Patterns (スコア:1)
今度実践してみます。
海外出張があれば……
Re:Refactoring to Patterns (スコア:1)
---- 末は社長か懲戒免職 なかむらまさよし
Chain of Responsibilityパターン で責任回避 (スコア:2, おもしろおかしい)
あれ… (スコア:1)
#わざとだよ
/* Kachou Utumi
I'm Not Rich... */
う(汗) (スコア:1)
きたけど、自分はスパゲッティに一票。
#孵化するの(できるの)か?
---
「萌え」「美少女」「メイド」に現実逃避してはいけませんか、そうですか。
人事を半分尽くして天命を待つ
Re:う(汗) (スコア:0)
# 同じくスパゲティ職人なのでAC
Re:う(汗) (スコア:0, おもしろおかしい)
Re:う(汗) (スコア:0)
いつも火事場を渡り歩く私は、必然的に
スパゲティ山盛りになる訳で orz
趣味の方もかれこれ10年はコード書いて
無いからなぁ…
いつも、馬鹿みたいなルールに苦しめら
れているのでAC
通信プロトコルはCommand (スコア:1)
通信のプログラムを書くときは一本道で書き始めるとあとではまりそうなので、何はともあれ状態遷移図を描いてCommandパターンで。
状態毎にクラスが量産されるのが嫌んなわけですが。
# ええ、未熟者ですとも。
いつも最初は (スコア:1)
が、仕様変更が重なることと時間制約が厳しくなるにつれ、
絡まりが増え、いつのまにかタダのスパゲッチーに。
なので、スパゲティーに一票。
修行が全然たりませんか、そうですか。orz
T.Sawamotoでスパゲティ量産 (スコア:1)
ご飯炊くのがめんどくさくて……
#え?ナニカチガウって?
ψアレゲな事を真面目にやることこそアレゲだと思う。
プロトタイプ厨 (スコア:0, 余計なもの)
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
Re:プロトタイプ厨 (スコア:0)
一度動けばいいんだ~
本格的なモノは専門家に作らせる。
Re:プロトタイプ厨 (スコア:1)
旅に出ます.(バグを)探さないで下さい.
Re:プロトタイプ厨 (スコア:1)
Re:いや貴方はオールドタイプ厨だ (スコア:1)
・・・嘘です。
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
今日日、 (スコア:0)
Re:今日日、 (スコア:3, すばらしい洞察)
コンビニ弁当の様に常に付いているって頻度なら結構あるかと。
#表から見えないところに隠れてるって微妙なとこも似てたり(w
Re:今日日、 (スコア:1)
開発者は意味も分からずテンプレートをいじるだけ・・・。
# もうやだ(T-T)
Re:今日日、 (スコア:0)
気になってしかたがない (スコア:0)
デザインパターン?なにそれ美味しいの? (スコア:0)
# Objectなんちゃらっていろいろ有ったな
# 本物のプログラマには関係なかった・・・と思う
Re:デザインパターン?なにそれ美味しいの? (スコア:1, おもしろおかしい)
本物のプログラマにとって OO は不倶載天の敵です!
関係ないなんてとんでもない。
Re:デザインパターン?なにそれ美味しいの? (スコア:1)
昔、Pascalでリアルタイム制御やってました。
さらにHP9000+GPIB+SmallTalkで似たようなシステム組んでた同僚も居ました。(ぉ
# Pascalで(自分で書いた)アセンブラのドライバ呼び出しってのは日常茶飯事だったんだけど・・・
自分はプログラマとして本物だったのか?(w
Re:Object Orientedで (スコア:1)
顧客の環境の変化とか、時代の流れとかで、一度書いたプログラムへの要求が変わるのが「現場」なわけで、 プロセスとか OO とか言ってる人たちは、 いかに早く、安く、簡単に今動いてるプログラムに変更を加えることができるかってのを目指してるわけです。
Iterator なんて好例だと思うけど、for 文で二重に回すのを三回使わないと全アイテムにアクセスできないような構造があったとして、それがプログラムに何回も出てくるとします。旧世代根性プログラマは、その for 文をまるごとコピーしまくるわけですよ。 で、後日データ構造の変更があると、コピーした所全部を変更しなきゃいけないわけで。いつバグが入ってもおかしくない殺伐としたコードになるわけです。
ここで、複雑な for 文を書くだけのクラスを作って、for 文一つで全てのアイテムをアクセスする。データ構造の変更があれば、コードを直すのは一箇所だけ。こういうインターフェイスと実装を分けるみたいな発想は、何人もの人間が一つのプログラムを書くみたいな現場向けのものだと思いますけど、どうでしょう。
うーんとね (スコア:1, 興味深い)
でも、OOP向けの場所もあれば、そうでない場所もあって、誰かさんはOOPと構造化をごっちゃにしているだけだった、とか、そういうこともあるしね。
あと、メモリも使い放題、っていう環境ばかりでプログラミングしている人ばかりじゃ、ないんですよね。その証拠に、最近、レアなCのプログラマって、あちこちで売れてる。需要がでてきているんだな。ネット家電がらみらしいんだけど。
インターフェイスと実装を分ける、ということとは違うこと言っているわけなんですけれど。
Re:うーんとね (スコア:1)
言語の方でメモリ管理とかインターフェイスとかをサポートしてないと、使ってて嬉しくはないかもしれません。 C でインターフェイスと実装を分けるっていうとモジュール化とか、ヘッダで露出してる関数を利用する立場のコードが中で何をやってるかを知らないですむって感じだと思うけど、それを実現するだけでかなり手間がかかると思います。
一方、抽象クラスとしてのインターフェイスをサポートしてる言語の場合は、クラスそのものの役割をインターフェイスで記述することができるわけです。
Iterator i = bar.createIterator(); // createIterator() returns BarIterator
while (i.hasNext()) {
Foo foo = (Foo) i.getNext();
foo.doSomething();
} // while i
Re:うーんとね (スコア:2, 興味深い)
例えばRuby。文法上、「型」の概念をなくしているので不要だからだと思いますが。
そのような言語でもデザインパターンは利用可能であるし、オブジェクト指向分析手法も業務分析に使えます。
というところが、OOの特徴と言えるかと考えますが、いかがですか?
実装寄りの話だでOOを説明しても片手落ちじゃないでしょうか。
Re:うーんとね (スコア:1, すばらしい洞察)
>需要がでてきているんだな。ネット家電がらみらしいんだけど
そして、将来はどうなるのでしょうか?
1.実行環境の充実
2.多品種、多機能化に対応するソースが必要になる?
3.大量の変更箇所になやまされる?
4.徹夜作業が増加する(困った!)
そのときになってから、その場しのぎの勉強をするのか?
それとも、今のうちに概念だけでも勉強しておく?
アセンブラが多かった時代から、
C言語になったような、
変化が起きるのではないでしょうか?
それとも、今でも全てアセンブラで書いていますか?
結局はベースかな? (スコア:1, すばらしい洞察)
> C言語になったような、
> 変化が起きるのではないでしょうか?
実行環境の充実はもちろんある。なによりも家電品でも使えるメモリの量が増えてるし、これからも増えていくと思う。この実装レベルでのベースの拡大があってこそ、より高級な言語のある意味が出てくる。いまでもアセンブラで書くのは、結局のところ実行時メモリが極端に限られた場合とか、ハードのクリティカルな制御でステップごとのタイミングとかを気にしなければならない場合だから。
そういう意味ではCはしょせんちょっと賢いアセンブラ、というところだね。プログラミングをするところには、そういう世界もあるよ、ということなんだと思うのだけれども。
扱うものや、プログラムがどこに使われるか、など、いろいろな世界があるんだけれども、自分の知ってる世界だけで「これが一番!」みたいに言う人も、ここには多いのかな。まぁ、それしか知らなければそうなっちゃうわけでしょうけれど。
ただ、これらのベースになっている「メモリ」などのハードウエア資源が、この先も限りなく、より大量により安く供給され続ける、という保証があることが前提なんだな。これまではなんとかその通りになってきたけれど、問題はこの後、世界経済が縮小に向かっている今日に、どれだけの期間、これが保証されるか、ということも問題だと思うのですよ。
「いやー、ぼくはソフトの技術者なんで、ハードはわからないんだよね!」でも悪くはないけれど、自分の仕事の発展とか変化を支えているものへの関心は、そういう意味で持っていたいですよね。
で、まぁ、どっちに転んでもよいように、あれこれ勉強していって、新しいことを吸収するのは必要なこと、ということに変わりはないのですけれど。とは言うものの、人間は歳をとるから、1人の人間がずっと同じテクノロジの現場にいられるかというと、そうでもない、という人も多いんじゃないかな?年齢が上がれば管理職にならなきゃいけないからテクノロジだけを見ているわけにはいかない、とかいろいろあると思うのですよ。
世の中の変化は良いほうにだけいくわけじゃないし、自分も歳をとるし、そういうことも考えておいたほうがいいと思うんだけど。
Re:うーんとね (スコア:1)
ネット家電ではない組み込み関係ですが。
今まさにそういう対応、そういう状態から脱出をはかる作業をやっているところです。が、デザパタどうこうなんて考える暇もないです。次々にやってくるリリースの嵐に、その場しのぎで適当に作るしかないです。まさにスパゲティの大量生産。きっと、そういう状態でひぃひぃ言っている同志もそれなりにいるのではないでしょうか。
そう、その前に仕事の管理の仕方から練り直さないと!ソースデザインはその後の話。てことで、組み込み系はかなりのんびり時間が進んでおります。仕事量は多いけどね。
正直、私のところはここ5年は何にも変化ないだろうなぁとは思います。なんか別チームでいろいろ検討(人間がコーディングしないようにするとか)はしているみたいですが、いかんせん同じ会社の同じ部署とは思えないほど意思疎通がなってないので、進行状況は不明です。ま、先行きはなかなか読めない、ということかと。だからこそどうなってもいいように自分で勉強はしておこう(あれ?w)。
ほえほえ
Re:うーんとね (スコア:1)
The Internetという言葉は、発する人によって100通りのニュアンスがある。
と書いていたのはJargonでしたっけ?
アレとは違う、コレとも違う。ではなくて、あれも特徴の一つ、コレも特徴の一つ…と考えるのがいいと思いますよ。
または「それだけではない」と説明するかですね。
Re:Object Orientedで (スコア:0)
Re:Object Orientedで (スコア:1)
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
Re:Object Orientedで (スコア:0, すばらしい洞察)
# 設計しないのかな、この人。
Re:Object Orientedで (スコア:1)
Re:Object Orientedで (スコア:0)
まぁ、そういう香具師は「構造化プログラミング」の理解すら怪しかったりするけどね。
Re:Object Orientedで (スコア:0)