「コンストラクタ」を含む日記 RSS

はてなキーワード: コンストラクタとは

2017-07-02

日本人はなぜ入門者に厳しいのか?

週末の書店

プログラミングコーナーに行くと、いつもうんざりした気分になる。

何故ってこんなに入門書が溢れかえっているのに、何一つとして入門者向けの本が無いからだ。

日本書籍小売の総本山神保町三省堂書店の棚の端から端まで見た所で、ビギナー向けの本などありはしない。

なぜなら、入門書を謳っている本のコードほとんどが動かないコードからだ。

入門書だと言うのに、ページを割くべきところに文章イラストを割かない本が多すぎる。

例えばポインタコンストラクタインスタンスカプセル化…それぞれの概念

イラスト入門書だってそうだ。「入門」と書いてあるからといって、開いてみればデッサンや形のとり方を教える本などありはしない。

そう、日本入門書とは「元々デキる人がリメディアルとして持っておく本」のことであり、「ビギナー向けのウェルカム本」ではないのである

からといって、誰もがpython専門家になる胎教を受けて産まれるわけではないし、誰もが10代で写真と見まごうスケッチを描けるわけではない。

基本的には「デキる人」に着いて指導してもらうのである

では、その「デキる人」は誰に教わったのか?やはりデキる人たちや、海外入門書を車座になって読んで学習したのである

しかし、その「始祖・デキる人」がヒーロー時代とは、今とは複雑度合いも、求められるものも違う。

今は学生であっても、ある程度の高度な成果(ここでは、ネットで発表したものネットニュースでバズった経験や、学会評価された経験のこと)があって始めて企業受験票でしかない。

なぜ入門者向けの本がないのか?

それは(少なくとも)日本人初心者嫌いの民族からである

習うより慣れろ。仕事は見て盗め。教えられるのを待っているな。・・・

自分より出来ないやつに教えるのが大嫌いなのだ。(入門書の著者ですらそうなのだ!)

上にあるように、ある程度デキる人でないと、その手の会社には認められない。

からといって、大学教育で手ほどきを受けられるわけではない。これもある程度デキる人向けなのだ

では、書籍自助努力を、となっても、文頭にあるように、入門書向けの本など無く。

デキる人に一子相伝の手ほどきを受ける必要があるのだ。

では、デキる人はどこにいる?これもやはり雲の上の大学しかいない・・・

今はネットがある?これも難しい。

知恵袋や、teratailであっても、初心者に与えられる答えは「ググレカス」のみ。

では、ネットジャストな回答があるか?といえば・・・ない。基本的には公式リファレンスコピーや、動かないコードしかない。

デキる人は、デキない人の気持がわからない。何がわからないのかわからない。

からあいつらがわからないのは、あいつらが勉強不足だから、と考える。

からないのは、あいつらの自己責任だ。だから初心者は嫌なんだ。となる。

適性を測っている、という見方もある。

しかし、適性というもの基本的にやらなければわからないもので、やる前の教育から放棄しているのは適性を測るというより、

単純に教育放棄しているだけにほかならない。

日本人初心者軽視、というか教育軽視は今に始まったことではない。

「失敗の本質」でもそれは指摘されている。ということは戦時から既に教育嫌いなのだ

職場でもそう。教えられるのを待っているな、と言っておいて、いざ聞きに行けば「常識でわかるだろ」「ネットで調べて」「リファレンスマニュアル調べて」

学校でもそうだ。

授業の勉強も予習が前提。では授業ではより高度な話をするのか?しない。教師我流の演習である

演習するだけならば、家や図書館黒本赤本を解いていたほうがマシじゃないか

学校教育ですらこうだ。

日本人はとにかく初心者が憎い。潰したくて仕方がないのだ。

2014-09-05

1人教祖

僕たちはいだって宗教戦争だ。

エディタで。vimキーバインドで。teraterm背景色で。ログファイル名称で。変数名で、タブの桁数で。spfileの設定で。jbossの設定のおまじないで。stratsの継承方法で。エラークラス名で。プロパティ名で。セッターゲッターを付けるかつけないかで。コンストラクタで。newを上書きするかしないかで。jreのeditionで。eclipseの見た目で。javadocのエディションで。クラウンドキュメントIDで。githubにいくつ持っているかで。tryのインデントで。タブを表示するかしないかで。エディット中の飲み物で。待ち合わせはスタバなのかエクセルシオールなのかで。セブンイレブンコーヒーサイズで。そのコンビニコーヒーが一番うまいかで。IDカードは伸びるストラップがいいのか悪いのか。寝るときは机の下か椅子を並べるのか。デスクの上にフィギュアは置いていいのか悪いのか。めんまつるこか。

いつだって宗教戦争の糸口が僕たちを待ち構えている。とても恐ろしいことだ。

2014-07-11

PSCmdlet を継承したクラスコンストラクタで MyInvocationに触れるとオチ

http://anond.hatelabo.jp/20140711202103

今のところ、それしか考えられない...

コンストラクタを抜けた後のどこか(しか自分コードの中ではない)、NullReferenceException。

基底クラスの中?

MyInvocationプロパティgetアクセッサ関数内あたりで、初期化必要な何かをやっているのだろうか?

2014-04-09

オブジェクト指向 v.s. 関数型プログラミング

近年、関数型プログラミング重要はいろんなところで叫ばれています

Javaの最新バージョン関数型プログラミングに関する新機能が加わりました。

Rubyも昨今、関数型プログラミングへのサポートが手厚くなってきています

プログラミング教科書大手オライリーからJavascript関数型プログラミングを行うための解説書が発行されました。

関数型プログラミングへの注目度は高まってきています

おそらく、みなさんは既にオブジェクト指向が何か、を知っています

でも関数型プログラミングとは何か、胸を張って語れる人は、周りに見当たらないかと思います

実際、オブジェクト指向によってプログラミングする方法は、わかりやすい解説があちこちにある一方で、

関数型プログラミングとは何か、何が良いのか、ということについての、よいまとめは見つけることはできませんでした。

この記事を読む方の中で、「関数型プログラミングを取り入れるか・取り入れないか」で切実に悩んでいる人は、おそらくいないでしょう。

この記事はあまりかいところに立ち入りません。関数型プログラミングを使う側の立場に立って、利点や向き・不向き、それが導くスタイルを書きました。

みなさんは鳥のように飛んで、高い空から関数型プログラミングとは何か、何が良いのか、を見渡してください。

ふたつのアプローチ比較

オブジェクト指向アプローチは、名前をつけてプログラムを整理する

関数型プログラミングアプローチは、汎用部品でなんとかする

オブジェクト指向アプローチ

Googleが近年リリースした言語、Goには、”継承”を直接サポートする仕組みが無いことが話題になりました。

また、Mac OSXの基幹ライブラリCore Foundationは、ライブラリ自体C言語で書かれているにもかかわらず、その設計方針は明確にオブジェクト指向です。

継承クラスは、オブジェクト指向必須条件ではありません。

オブジェクト指向本質とは、何でしょうか。

その本質とは"名前をつけて対象を識別し、それを扱うこと"、にあります

最もプリミティブなオブジェクト指向対象は、ファイルハンドラです。あるファイルを開いて、読み込んで、あるいは書き込んで、ファイルを閉じる。

これらの処理をまとめたら、わかりやすいですよね?

対象に関する処理を、対象の周りにまとめる。これがオブジェクト指向の基礎的な理念です。

識別することとイコール比較できることは、とても良く似ています

イコールによる比較は、オブジェクト指向では鬼門であることが知られています

PointクラスインスタンスとColoredPointクラスイコール演算をどう決めればいいかに、正解はありません(詳しくは"effective java"をご参照ください)。

また名前をつけて識別する対象は、フワフワしていてはいけません。

たとえば、"軍人階級"をオブジェクトにしたとしましょう。"大佐"クラスのある兵士名前フィールドや、性別フィールドを持っているでしょう。

ところで彼が昇格したときに何が起こるでしょうか。

新たに"少将"クラスインスタンスが作られます。"大佐"クラスを破棄する前に、名前性別、その他沢山のデータを引き継がなくてはいけません。フィールドを増やしたい場合はその都度コード修正を加える必要があります(*)。

なるべくイコール比較を避けたい。対象不安定なものはいけない。では何に名前をつけて、識別するか。そこにオブジェクト指向技術者の熟練度が現れるのです。

関数型プログラミングアプローチ

一方、関数型プログラミングでは、特定の何かに名前をつけるより、極力、汎用部品でなんとかしようとしま

さな関数を、集めて撚り合わせて、新しい関数を作る。

関数自体リストなどのデータ構造に詰めることもよく行われます

実は、関数型プログラミングというのは本質を表していません。

その真の名は、"値指向プログラミング"です。

関数をはじめとして、リスト・ツリーのようなコンテナ手続きを抽象化したもの、回路を抽象化したもの

あらゆる対象を値として、合成し、ときに分解し、新しい値を作ります

変数という概念必要ありません。

変数適用する処理を作りあげることが、とても簡単だからです。

四則演算定義されたデータを詰めたデータ構造もまた、四則演算可能だったり。

値をイコール比較することも、なんのそのです。

誤解を恐れずに言うと、オブジェクト指向トップダウンなのに対し、関数型プログラミングボトムアップです。

関数型プログラミングの利点

読みやすい・理解やす

関数型プログラミングサポートする言語には、沢山の汎用部品定義されています

このような構造インターフェイスとして、様々なライブラリが組まれているので、

たとえばモナドを知っていれば、30分程度でパーサー(解析機)を理解することができて、

パーサーを理解できれば、JSONパーサー・ XMLパーサー・markdownパーサー・C++パーサー ... などを理解するのはとても容易です。

理解やすいこと。これが関数型プログラミングの大きな利点です。

追記:

また、汎用部品と型のお陰で、ライブラリドキュメントが圧倒的にひきやすい、というメリットも有ります

Haskellな人がPythonにトライした結果 - Togetterまとめ

書きやす

関数型プログラミングは「厳密な事前設計必要とするため、簡単なことをやるのにも時間が掛かる」。

よく誤解されていますが、これはウソです。

スクラッチプログラムするのは、非常に手軽です。

>> map (*2) [1,2,3]
[2,4,6]

邪魔な”儀式”や、"おまじない"のコードが徹底的に撤廃されているためです。

関数型プログラミングコードは、潔癖かつ濃密です。

たとえばC言語でint hoge(int x,int y)が定義されているときhoge(3)はなんの意味も持ちませんが(コンパイルコケますが)、関数型プログラミングでは意味があり、実際に有用です。

上の例では、「掛け算をする」(*)関数は、二引数関数ですが、それに引数を渡して作られた「2を掛ける」関数(*2)は、一引数関数になります

関数型プログラミングでは、「簡単なことは簡単にでき、複雑なことは複雑にできる。ただし、間違ったことは殆どできないか、全くできない」。

多くのバグは、コンパイルエラーとして検出されます

また、静的型付けの力によって、コード補完は非常に強力になっていますインテリセンスの比ではないです。

たとえば、関数中のある表記の型を任意に表示できます(GHC/TypedHoles - HaskellWiki)。

やがてやってくる未来には、プログラムテキストエディタで書くことは時代遅れになっているでしょう。

統合環境サポートで、バグミスの少ない、スムーズプログラミングができます

そしてその環境で動くプログラミング言語は、関数型プログラミングサポートした言語なのです。

いつ関数型プログラミング

以下の様な兆候を感じたら、あなたはそのプログラム関数型プログラミングで書くべきです。

一般に、オブジェクト同士の相互作用が複雑になるほど、オブジェクト指向では手に負えなくなっていきます

そういうときは、オブジェクトを直接扱わず、替わりにその"相互作用"を扱うことで、複雑さを軽減するアプローチ有効です。

それこそが関数型プログラミングアプローチです。

オブジェクト指向の利点

初心者にとっては読みやすい・理解やす

特にオブジェクト指向有効なのはプログラミング初心者がそのコードをいじるかもしれないときです。

関数型プログラミングは、強固さと柔軟さの代償として、高い学習コストを伴います

そのため、初学者にとってはハードルが高いのです。

扱う対象があまり複雑でない時は、書きやす

オブジェクト間の相互作用が複雑でなく、着目している(名前をつけている)概念が安定しているとき

そして、プログラムをいじる人たちの間で共通理解が図れているならば、オブジェクト指向が有利です。

関数型プログラミングの得意分野はなにか

数値計算

遅延評価という機能によって、レガシー言語で扱えなかった、巨大な数を扱うことができます

分数を扱うことができます虚数もです。

関数型プログラミングで書かれたプログラムは、正確さが要求される、金融関連の業界で使われています

テキスト処理

手続きとしてパーサーを記述できるので、テキスト処理プログラムはより理解やすく、メンテナンスやすものになります

関数型プログラミングを知らない人は、「正規表現おk」と言いますが、

彼の書いた複雑な正規表現は、半年後には(書いた本人でさえ)理解できなくなっていることでしょう。

並行処理

手続き一般を扱うことができるので、途中で割り込みのある手続きの表現も容易です。

関数型プログラミングサポートしていない言語ではコルーチン(ファイバー)などをつかってなんとかするしかありません。

さもなくば、非並行処理では普通に関数として記述できるところを、並行処理のために、Builder,Strategy,Command,Interpreterパターンを駆使して書き直すことになります

Javascript使いの方は、Deferredなどの構造を使うでしょう(http://qiita.com/KDKTN/items/4c6986049d204f0645d8)。

C++使いの方はBoostで頑張りましょう。破滅的に解りにくいコンパイルエラーメッセージと格闘してください。

レシピ

もう少し簡単な例をあげます

あなたは、あるレシピにしたがって、自動的料理を行うマシン制御プログラムを書いているとしましょう。

料理レシピは、"手続き"ですよね?たとえば、カレー

1. まず玉ねぎを炒める。

2. 飴色になったら、肉を加えて炒める。

3. 野菜を加える。

4. 水を加えて煮る。

5. スパイスを加える。

しかあなたはこの手続きを関数として表現できるでしょうか。

…できませんよね?何故ならば、各ステップの"間に"、マシンのロボアームの位置や動きを調整する処理が必要からです。

これをオブジェクト指向でやろうとすると、各ステップ副作用として、それらの処理を行うことになります

そうすると、マシンが二機に増えた時などの変更量は、絶望的なものになります

あるいは関数として表現するのを諦め、手順全体をDSL記述できるようにします。

このアプローチ関数型プログラミング的です。しか関数型プログラミングサポートした言語の助けなしでは、そのDSL記述するために沢山のユーティリティコードを書かなくてはならないでしょう。

オブジェクト指向アプローチでこの問題をエレガントに解こうとすると、クラス化の粒度を上げる事になります

野菜クラスフライパンクラス、ボイルクラスフライクラス、焼き加減クラス、アームクラス野菜の大きさクラス、切り方クラス、焼き方クラス、"焦げたよ"クラスetc...

こうすると早晩レシピプログラムコードから消え去ることになります。上記のたった5行は、依存性注入のオブジェクトグラフを構築するコードに取って代わることになります。そこには沢山の挙動制御オプションとして付記されているのです。

カレーなど、ある種のレシピ限定することで、見た目の理解やすさを得ることができますが、一方それは表現力を損なうことを意味します。

C言語などではマクロを使うこともできますが、それは結局、関数型プログラミングアプローチ意味するところと同じになります。すなわち、補助のために沢山のコードを書くことになるでしょう。

GUI

iOSのAppstoreアプリは、"無料"と書かれたボタンを押すと、それが"インストール"ボタンに変わり、それをもう一度押すと、ダウンロードの進捗を表すインジケータに変わり、それを押すとダウンロードキャンセルできます

このように、位置は同じなのに、ステートに依って見た目と機能が変わるボタンは複雑です。

これをオブジェクト指向で実現しようとすると、

1. 三つの異なるボタンを同じ位置に置くか

2. 同じボタンが三つの異なる機能を持つか

という下らない問題にぶつかります

一方関数型では、"機能"、"見た目"、"状態"、を独立に扱って、それらを合成してボタンを作るので、迷うことはありません。

「同じ位置にあるUIオブジェクトは、コード上で(インスタンスとして)独立して、他から干渉を受けない」

この条件が満たされているうちは、オブジェクト指向GUIを実現することに無理はありません。

しかし、携帯端末のような小さい画面で、多くの機能を達成するためには、UI要素はコンテキスト依存的に複雑になりがちです。

近年、PCのディスプレイの大きさは、頭打ちになってきました。

画素数は増えているのですが、MacにおけるRetinaのように、複数ピクセルひとつドットを表すようになってきています

これは、ひとつの画面に置かれるボタンなどのUI要素の数は、これから先の未来で増えることはない、ということを意味します。

したがって、未来GUIプログラミングは、注意深く機能ピックアップして制限するというデザイナー努力を脇におけば、

関数型プログラミングの力を頼るしか無いでしょう。

はじめよう、関数型プログラミング

まり

Haskell さいこうなのおおおおおおおおおおおおおおおおおお!! おしっこ漏れちゃうのおおおおおおおおおおおおおおおおおおおお(゜∀。)ワヒャヒャヒャヒャヒャヒャ

1. google:すごいHaskellたのしく学ぼう を注文する。

2. Download Haskell自分のPCに導入する。

3. コンソールghciと入力して、対話コンソールを立ち上げる。

4. 次の関数コンソールに打ち込んで、結果を見る。即値で書かれているところとかをいろいろ変更してみて、感動する。

take 4 $ map (*2) [1..]

5. ステップ1で買った教科書を読んで、学ぶ。


追記:

いかがでしたか

ちまたには、関数型プログラミングの利点は変数が無いことだ、とか、より安全から、とか、より速いから、などという妄言が満ち溢れています

オブジェクト指向関数型プログラミングは、水と油ではありません。プログラマ自分プログラムに最適なアプローチを選ぶことができます

一般にはあまり知られていないことですが、Haskellにもオブジェクト指向へのサポートがあるんです(Lensライブラリ、これを使用したサードパーティライブラリ最近増えてきています)。

この記事を読んだオブジェクト指向プログラマあなたが、少しでも関数型プログラミングに(そしてHaskell)興味を持ってくださって、ホームセンター大人用オシメのコーナーが大賑わいになれば幸いです。。

2014-02-19

ユーザーコントロール一般的クラス継承したら

継承したクラスコンストラクタで、自分自身の InitializeComponent() を呼び出しましょう。

基底クラスイベントを捕捉する場合には必須

.NET Framework にて。

2013-11-16

武蔵をお迎えして、艦これをきっぱり辞めると決めてから

初めて迎えた土曜日が暇で暇でしょうがない。

はてぶの記事を上から読んでいくのにもすぐに飽きた。

コンビニ飯ももういいや。

モルモットみたいに部屋をうろうろして使ってない2Kの倉庫部屋を開け放したら、

それだけで空気が淀んだ。

部屋の片隅にはここ二年間まともに開いてもない蔵書の山。

一瞥しただけでは分厚い埃が積もって何の本かわからず、

拭ったらそれだけで咳が出た。結城浩さんのデザインパターンの本にマーチンファウラー氏のリファクタリング

ここ最近、参画するプロジェクト業務はテスターばかりで、そんな概念があることすら忘れていた。

PMになってもおかしくない歳で、テスターばかりやっている自分が今更読んで何になるんだよと思いつつ、ぱらぱら捲ってみる。

「このコンストラクタにpublicがないのは同じパッケージ以外からの参照を防ぐため」←ここ使えるっ!

『使える』かよ。ひどく気に障るメモだった。

この本を読んで、いつか設計することを夢見ていた頃の残滓だった。

2012-07-13

いや、わかるけど・・・

初期化は必ずコンストラクタで みたいなことを Javascriptで言い出すなら

もう、自由な言語じゃなくて、C++みたいな 型定義型の言語にしちゃえよ。

2012-06-15

http://anond.hatelabo.jp/20120615111615

スマートポインタは、ここで言われている アドレスの参照指定としてのポインタじゃないよ。単なるコンテナ名前ポインタってついてるからといって、いわゆるポインタじゃない。分類的にはコンテナ

 

const char *str = "hogehoge";

std::string str = "hogehoge";

std::tr1::smart_ptr<std::vectorchar> > hako(new std::vectorchar>);

の3種類があった時に string型も ポインタを代入しているが、 ポインタとは呼ばないだろ。コンテナと呼ぶ。

記法上 new を呼び出すが、 それが嫌なら、そういうコンストラクタ書いてもいいしな。

 

const char*なら

str++ とか str-- str+n という記法アドレス参照 ができるが

スマートポインタは そういう使い方はしない。 あくまでも指定されたオブジェクト管理するだけ。

たいていの使い方をする場合に、参照カウンタの増減なんて手動ではしないから。(というか、ポインタがわからない奴がするな コピコン使え という設計方針でいいとおもう)

そして、マーク&スイープはガベコレの技法からまして、自動でやるもので、たいていのプログラマーに書かせるものじゃない。

http://anond.hatelabo.jp/20120614121920

ポインタ、参照(リファレンス)、束縛(バインディング)、それぞれ似てるけど同様に語ると混乱の元ではないかと。

 

ポインタメモリアドレスに型情報をくっつけたもの。加減算できる点が特徴で、それはメモリアドレス概念由来だろう。

変数というメモリ上の記憶域を指すフィジカルに近い概念で、配列運用(*p++で回すとか)、引数の参照渡し(コピー抑止、複数戻り値の実現)、メモリのもの管理malloc)あたりで、基本手作業による最適化のための仕組みという側面が近いと思う。

 

perlだと、変数はやっぱり記憶域ではあるけれど概念として一段抽象化されていて、メモリという連続した領域じゃなく独立した領域の集合となっているから、リファレンスの加減算はなし。

また、配列も単なるメモリの並びからより抽象化してリストもできたから、配列運用や複数戻り値リストがあるのでリファレンスに頼ることはなくなる。

ただ、オブジェクト概念があって、オブジェクトオブジェクトとして入れる変数は用意せずリファレンスとすることで、文法上の変数の型を増やさない、コピー時のコンストラクタの問題を回避するなどのほか、オブジェクト概念を援用して無名関数無名変数ファイルハンドルなども変数引数として扱えるようにした。

 

で、pythonはもう一段推し進めて、今までの数値や文字、配列オブジェクトとみなし、変数はすべてオブジェクトを指し示すもので、記憶域は変数としてあるのではなくオブジェクトとしてあり、変数リファレンスという特別なものがあるのではなくなり、変数記憶域をもっていて値が代入されるものではなく、既にあるオブジェクト変数名という名前(ラベル)を付けて束縛する行為とされる。

見方を変えると変数はすべてにおいてリファレンスで、代入とは値そのものの代入でなく値へのリファレンスの代入で、引数も参照渡しであるが、引数に代入したところでリファレンスが変わるだけで元の値が変わるわけではなく、しかし他の演算などでは自動的にデリファレンスされており、単純な数値や文字列など、自身を変更する機構を持たない(できない)ものにとっては実質的に今までとの違いはないに等しい。隠ぺいといえば隠ぺいか

java, javascript, rubyもおおむねこの考え方でよかったと思う。

ただ、phpは若干両者が混じったところがあって微妙なところがある。

 

参考

2012-06-14

http://anond.hatelabo.jp/20120614151953

それ、単純にクラスの使い方が悪いってだけに見えるんだが。

少なくともそんなカツカツにタイミング調整が必要になるソフトで、そんな頻繁にオブジェクト生成すること自体間違ってるし、頻繁に生成されるオブジェクトコンストラクタにクソ重い処理を入れているのも問題だし。

回生成したオブジェクトを使い回せないかとか、クソ重いけど一回実行すれば当面実行しなくていいような初期設定処理はファクトリクラスとかに追い出せないかとか、叩きようはいくらでもあるぞ。

http://anond.hatelabo.jp/20120614151953

メモリはいくらでも取っていいが、CPUは有限資産からな。

PC プログラマだけどメモリは潤沢なのに CPU 資源だけ制限があるってすごく不思議に聞こえる。

今頃は PC だったら CPU 資源はほぼ無限 (少なくとも C++ コンストラクタ呼び出しを気にしない程度には) だぞ。

組み込みの話だとしても組み込みなら両方ともきついんじゃね?

http://anond.hatelabo.jp/20120614144026

いや C++コンストラクタが、使わない時にでも動くのが嫌なので

メモリは バルクで取って コンストラクタ必要な時だけ 手動で呼び出すぞ。

メモリはいくらでも取っていいが、CPUは有限資産からな。

 

それこそ、必要な時だけnewすればって考え方もあるが、メモリフラグメントする。

俺らの時代だと、そのへんは脊髄に染み付いているから、考える考えないじゃなくて、普通にやる。

 

なんで?いや、サクサクアニメーションとかを追求すると このへんを突き詰めないと30fpsとか60fpsとか出ないだろ。

欲しいのはメモリ管理じゃなくてUX なんだが、結果 メモリ管理踏み込む

2012-01-04

プログラミング初心者たわごと

JavaScript って生き物っぽいって思ったのがきっかけだった。

なんか菌?に遺伝子いれてたんぱく質生産させるやつ? Function は菌の細胞膜prototype遺伝子で、だから prototype全然関係ない違う生物遺伝子を生きてる菌に入れちゃったり。そうすると全然ちがうたんぱく質生産されたり。prototype にべべーっとコピーして追加するのなんてまさしくそれっぽい。

インスタンスからじゃないと複製できないのも生き物っぽい。

インスタンスって言い方になにか違和感があるなあ。

だってプロトタイプベースって、生き物しかいない世界じゃない?基本的に。インスタンスってのは生き物じゃない設計図があってそれにしたがって出来た生き物がインスタンスってイメージあんだけど。プロトタイプベース世界にはそんな設計図も生き物じゃないものもないよね?なのにわざわざインスタンスっていうのに何か違和感ご都合主義的なもの感じる。クラスは型で、インスタンスを実体だとかなんとかって氾濫してるせいかな。多分この辺の用語が JavaScript をわかりにくくさせてる気がする。

僕の感覚では、オブジェクトってのは生き物で、クラスベースってのは神が設計図に基づいて生き物を生産してる世界で、インスタンスベースってのは生き物が生き物を複製してる世界イメージだ。多分、原始の生物インスタンスベースみたいな世界で、海の中にうようよしてたんだろうな、とか。

オブジェクトじゃないものは、生き物じゃない死んでるたんぱく質RNA の破片みたいな。それだけじゃなにもできないみたいな。それだけじゃ命がないから、生き物の殻に詰めるってのが JavaScriptコンストラクタイメージ

Perl の bless したらこれはもう命入ったよ生き物だからねっあとは勝手にしてねってのも、Python名前空間さえあればなんとかなるよねってのも、JavaScriptハッシュさえあれば世界作れるよねってのも、みんなどこか似ている。ちゃんと OOP を理解できてるかは別としてもこの三つはわりとすぐやりたいことができた。昔 Java の本を買ってきて挫折したのにくらべたら、なぜかずっとわかりやすかった。(bless という命名はすごく洒落てる)

全然関係ないけど、Django日本語リファレンスは何か萌えるラクダ本日本語訳はむかつくのに。

プログラミングを始めたばっかりの時は、なんだか難しい用語の意味を理解しないと OOP がわからないと思ってた。それは僕らの住んでる世界とは全然関係のないプログラミング技術ってやつだと思ってた。

でも多分違う。

世界が動く仕組みさえあれば、あとは作り手に世界の成り立ちを抽象化する表現力さえあれば、世界勝手表現されていくし、動き出してく。たまたま僕らの世界オブジェクトもので溢れていて、プログラミング言語進化すれば世界に似るのも当然だろう。いや逆か。プログラミング言語世界に似てきたから、オブジェクトなんていう世界に似た概念が出てきたってことか。なんだか難しい用語ってのは、その表現の一部分の技術名前をつけてるだけなんだな、と。例えば何とか歌唱法や何々画法とか何とかレトリックとかパースの取り方みたいなのと同じ。それは表現を理解する手助けにはなるけど、その意味を知る事がイコール表現力をあげることにはならないんだよね。これに気づくのに遠回りしすぎたなあ。

(知識を得るだけで、100% 還元される人もいるかもしれないけど、そんなのは一部の天才だけだと思う。殆どの凡人はそうはいかない。とはいえ、元の錬度が低ければ、コツをいくつか教わるだけでいきなりうまくいくこともある。ただ、それをまるまんま実力だと思うのは、どんな分野でも危険だ。恋愛テクニックやらを必死に読んでる連中が男女間の深い人間関係を上手くやれてるとはちょっと想像できない!)

プログラミング表現力を上げるにはどうすればいいんだろう。きっと他と同じだろうな。いい表現を沢山味わって、世界をよく観察して、どう成り立ってるかどう動いてるか、私達はそれをどう認知しているのか、考えることかもしれない。漫画家を志す人が美術解剖学を学んだり、優れた画家が絵筆で世界を生々しく描写するように、優れたプログラマ世界のなりたちをプログラムに写し取ったり、世界の仕組みを作る事が出来るのだと思う。

やっとプログラミング面白くなってきた初心者より。

2011-03-30

NetBeans の City Lights  で、クラス名が黒くなる問題

→少なくとも4年前には解決していない

http://goo.gl/hvY3k

http://netbeans.org/bugzilla/show_bug.cgi?id=114689

 

→Norway today」を改造して、City Lightsに似たオリジナルを作る。

クラスの色は「Norway today」と同じになるが、バックが黒に文字が黒よりは見やすい。

 デフォルトフォント:Monospaced 16

 

  凡例  前景  背景 その他

 

デフォルト 緑 黒

URL 継承 継承 →エフェクト:下線付き エフェクトカラー:青

インターフェース継承

エラー 白 赤

・エンティティー参照 シアン 継承

キーワード オレンジ 継承

クラス (→マゼンタ) 継承

コメント継承

コンストラクタ 継承 継承 →フォント:継承+ボールド-イタリック

・セパレータ 継承

フィールド 9,134,24 継承 →フォント:継承+ボールド-イタリック

マークアップ属性 0,124,0 継承

マークアップ属性継承(黄色?) 継承

マークアップ要素(タグ)オレンジ 継承

メソッド 継承 継承 →フォント:継承+ボールド-イタリック

メソッドパラメータ 160,96,1 継承

・使用されていない要素 グレー 継承

・公開要素 全継承

・列挙 全継承

局所変数継承

抽象クラスまたはメソッド継承

・数値 黄 継承

・文字 黄 継承

文字列継承

・(演算子) ピンク 継承

・空白 全継承

・識別子 全継承

・公開限定要素 全継承

・静的要素 継承 継承 →フォント:継承+ボールド-イタリック

・非公開要素 全継承

・非推奨の要素 継承 継承 →エフェクト:打ち消し線 エフェクトカラー:濃いグレー

2010-08-28

http://anond.hatelabo.jp/20100828182728

>可読性および処理速度、オーバーヘッド的な意味オブジェクト指向は駄目って言ってるんだろ

普通はこの1文で納得できるもんだが

ひょっとしてプリプロセッサ言語では「翻訳」が行われる事とか、オブジェクト指向的な処理をするのは最初コンストラクタが走るのでオーバーヘッドがかかる事とか、いちいち全部情報処理専門学校に入りたてのガキに教えるように教えないと全く判らないかい?

2009-07-08

本当にnewっていらない子

なんかPerlのblessっぽい。

JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)

というよりperlのnewっぽい。なぜか。

classクラス定義してnewでインスタンスを生成する言語を「一般的オブジェクト指向言語」とすると、

つまり、javascriptでnewを(直接)使わず、class(のようなもの)を作ればperlっぽくなる。

そもそもnewって何するの?

オブジェクトを作る。オブジェクトを作るには3つの動作が必要である。

  1. 領域を作る
  2. クラスと結びつける
  3. 初期化する

通常は言語仕様でこれらを行う"new"という命令が用意されている。しかし、必ずしも必要な物ではない。perlでは言語仕様としてはnewが用意されていない。new関数が存在するのはコーディング規約に従っているからに過ぎない。代わりにblessが用意されている。なぜこのようになっているのか。理由はいたって簡単だ。perlオブジェクトの実態はリファレンスだ。初期化を行うコンストラクタはどの道定義せねばならない。だから必要なのはリファレンスパッケージを結びつけるおまじないblessだけだ。コンストラクタで好きなリファレンスを用意し、好きなように初期化してblessすればよい。コンストラクタ名前コーディング規約でnewと決めた。一方javascriptはnewを用意した。{}でオブジェクトは作れるし、どの道コンストラクタは作る必要があるのに。

そもそもblessって何するの?

オブジェクトクラスを結びつける。しかし、javascriptクラスを持たないので必要はない。代わりに必要なのは、継承元との結びつき、プロトタイプチェーンの構築だ。

そもそも継承って何するの?

既存のクラスの性質や振る舞いを流用する。default状態を与える。一般的オブジェクト指向言語ではクラス定義時に継承元となるクラスを指定する。javascriptではクラスの代わりにオブジェクトを指定する。

そもそもクラスって何するの?

クラスとはオブジェクトの性質・振る舞いの定義だ。しかし、ダック・タイピングではオブジェクトの性質や振る舞いはオブジェクトの持つメンバにより決まるため、そのような環境ではオブジェクトに初期値と継承関係を与えるのが主な仕事となる。

そもそもコンストラクタって何するの?

コンストラクタオブジェクト初期化を行う。javascriptではクラスがないため継承コンストラクタによりオブジェクト初期化される。

つまりコンストラクタ継承すれば良いんじゃね?

var object = function(o) {
  var F = function() {};
  F.prototype = o.prototype;
  return new F;
};

JavaScriptのnewって本当にいらない子?(http://d.hatena.ne.jp/jdg/20090706/1246840565)

個人的には

var object = function(o) {
  var F = function() {};
  F.prototype = o;
  return new F;
};

で良いんじゃね?って思う。

更に、コレでは初期化しないから

var object = function(o, n) {
  var F = function() {};
  F.prototype = o;
  f = new F;
  if (n) for (var i in n) f[i] = n[i];
  return f;
};

みたいな。

さらにせっかくだからメソッドにして

var object = function(o, n) {
  var F = function() {};
  F.prototype = o;
  f = new F;
  if (not f.inherit) f.inherit = function(n) {object(this, n)};
  if (n) for (var i in n) f[i] = n[i];
  return f;
};

とか。

しかし、なんでこんなに今の継承機構は使いづらいのか。

2009-03-10

オブジェクト指向は、手続き型言語をやっていると自然に導かれる発想

手続き型言語をやっていると、データを組み合わせて取り扱う必要が出てくる。

例えば、顧客データを扱う必要があるとき、顧客の「名前、住所、所属、電話番号、取引内容...」などをまとめて取扱いたい。

そこで、構造体という発想が出てくる。

コンストラクタ、デストラクタ、メソッド、アクセス制御

手続き型言語では

構造体を扱っていると、新しく顧客データを作るとき、毎回毎回、作った後に同じ動作をしないといけないことに気づく。

具体的には、名前、住所、電話番号の登録。

そしたら、それをいっぺんにやってしまうために関数を作ることになるだろう。

init_customer(struct Customer*, char* name, char* addr, char* tel)

また、逆に顧客データが不要になったとき、メモリ解放などをさせるために、

delete_customer(struct Customer*)

も作ることになるだろう。

さらに、取引を行うたびに、取引データを追加しないといけない。そのために、このような関数を作るだろう。

add_deal_customer(struct Customer*, char* deal_name, char* deal_ammount)

そして、複数人でプログラムを作っていると

「おいおい!せっかく取引データ追加用のadd_deal_customer作ったのに、なんで自分勝手に追加してるんだよ!てか、その方法だとメモリ解放どうすんの?ちゃんと作ったの使ってくれたら、delete_customer()でできるようになってるのに」

って状況が生じうる。それを防止するために、コメント

「/* 取引データの追加は必ずadd_deal_customerを使うこと! */」

と書くことになるだろう。

てか、わざわざコメント書いたのにこいつ読んでねーし。あーあ、めんどくさいめんどくさい。

オブジェクト指向

そこで、だ。言語を少し別のものにかえて、構造体に関数を持たせられるようにしよう。

そして、構造体ができたときに、自動でinitって関数を、削除されるときに、自動でdelって関数を呼ぶとしよう。

その関数が、コンストラクタとデストラクタ

そして、add_deal_customerも構造体の中に入れてしまおう。名前は長くて面倒なので、

Customer.add_deal(char* deal_name, char* deal_ammount)

のようにしてしまおう。

さらに、add_dealを使わずに直接、取引データを追加しやがるならず者対策も付け加えてしまおう。

privateにした変数は、構造体が持ってる関数からしか、いじくれないようにしてやろう。

今まではコメント読まない馬鹿の世話に苦労していたのだが、これからはコンパイラがそういうやつにエラーを出してくれる。

継承

次は継承お話。話は変わって、今度はGUIパーツで説明する。

ボタンってあるよね。あれを作りたい。

普通に文字が書いてあって押したら何かが起こるボタンアイコンが描いてあって押したら何かが起こるボタン

この2つを作りたい。

手続き型言語では

まず、文字のボタンを作ろう。

関数を持てる構造体を作り、「表示する文字(変数)、クリックしたときの動作を定義する関数へのポインタ(変数)、描画命令が出た時に描画する関数(関数)、クリック命令を受け取り、構造体にセットされた関数へのポインタを呼び出す関数(関数)」

がいるかな。

次に、アイコンボタン。「表示するアイコン(変数)、クリックしたときの動作を定義する関数へのポインタ(変数)、描画命令が出た時に描画する関数(関数)、クリック命令を受け取り、構造体にセットされた関数へのポインタを呼び出す関数(関数)」

あ、さっき作ったのとほぼ同じじゃーん!文字ボタン構造体をコピペしちゃえ!

あとは文字の変数を、アイコンに変えて、描画命令を、文字描画からアイコン描画に変えればできるじゃん!

ところが、文字ボタンクリック命令を受け取る関数バグが見つかった!よし、デバッグできた!

けど、アイコンボタンコピペしてたんだった!またコピペしなおしじゃん。あーめんどくさ。

もしそれ以外に、チェックボックスボタンとか、もっと別のボタンとか、いろいろコピペで作ってたらもっとめんどくさ。

オブジェクト指向

そこで、こんなことができたらいいんじゃないか?

文字ボタンにも、アイコンボタンにも共通する、関数をもった構造体を作っておく。

ボタン構造体「クリックしたときの動作を定義する関数へのポインタ(変数)、クリック命令を受け取り、構造体にセットされた関数へのポインタを呼び出す関数(関数)」

そして、文字ボタンは、ボタン構造体に「表示する文字(変数)、描画命令が出た時に描画する関数(関数)」を、

アイコンボタンは、ボタン構造体に「表示するアイコン(変数)、描画命令が出た時に描画する関数(関数)」を追加すればいいんだ。

これを、継承と呼ぶ。

さらに、文字ボタンアイコンボタンも、同じ「ボタン構造体」を持っているから、どっちも同じ「ボタン」として扱うことができる。

後で画面内のボタンを全部解放する必要があるときとか、実はこれ、すごく便利。

別の構造体で扱っていたら、文字ボタン用の配列アイコンボタン用の配列を用意し、それぞれに作ったボタンをいれ、解放するときはそれぞれの配列の中身を解放しないといけない。めんどくさ。

けど、どっちもボタン継承しているから、ボタン配列を用意して、文字ボタンアイコンボタンも全部同じ配列に入れて、1つの配列の中身を解放したらいい。楽ちん。

まとめ

はい、そうすると、関数を持った構造体はもはや、もとの構造体とは違う感じになりました。

これをクラスと呼びましょう。クラスから作られたデータは、オブジェクトと呼びましょう。

なんか、オブジェクトがほかのオブジェクトから独立してカプセル化されてるみたいですね。

そして、オブジェクトが持ってる関数。メソッドとでも呼びましょうか。これ、まるでオブジェクト自分のやりたいことを知っているかのようです。

手続きを構造体や関数に細かく分離していくにつれて、構造体と関数の組み合わせってのが出てきて、まとまりが見えてくるのです。

そいつらをまとめてしまって、一つの部品として扱って、外からはあんまり部品の中身を見えないようにしましょう。

部品の中身を直接いじらせるんじゃなくて、部品をいじらせるための関数を用意して、それを経由してやってもらいましょう。

それが、カプセル化とかいうやつです。

こんな感じで、手続き型言語をやっていると、自然オブジェクト指向って方向にたどり着くと思うのです。

プログラミングに殺される

プログラマーの方か、プログラミングから逃げ切ることに成功した方はイラッシャイマセンカ?

暇がありましたら、お助け下さい。

生まれつき、生活保護が下りない程度の知能障害を持っている者です。 (診断書はないですが)

なぜかプログラミングを始めてしまいました。ここで変に夢を持ってしまったのが過ちでした。

それからというもの、失敗する度に落ち込み激しい鬱状態になり、できないことがあるたびに自傷衝動が起きてしまいます。

数百時間勉強しましたが、クラスオブジェクト、public/private、コンストラクタグローバル継承

その他数え切れないほどの専門用語が何一つわかりません。なんであんなものを理解できる人がいるのか不思議でなりません。

そして、それでもプログラミングがやめられません (決して楽しいという意味ではありません!)

向いていない、鬱になるだけとわかっていて一々試し、ますます死にたくなってしまう始末です。

なぜかはてなではプログラミングの難易度は低く扱われる傾向があります。プログラマーが多いからでしょうか。

自分が知らないだけで何かプログラムを簡単に学べる圧倒的抜け道のような方法でもあるのでしょうか?

そんな甘いものがないとしたら、せめてプログラミングから逃げだす方法はありませんか?

遺書に似たような事が書いてあった人間が万が一報道されたらTVデビューしてしまいます。

このままでは本当にプログラミングに殺されます。どうかお助け下さい。

http://d.hatena.ne.jp/scinfaxi/20070523/1179935877 の症状にかなり近いです

自殺を予告するつもりは一切ないので通報しないで下さい

2009-02-19

モダンPerl入門』を第1章だけ読んだ

巷のPerl Mongerな人たちの間で話題の『モダンPerl入門』を読み始めた。

第1章はオブジェクト指向トレンドの話で、とても興味深く読んだのだが、同時に「なんでこれPerlで実装せなあかんの?」と疑問に思った。ていうかオブジェクト指向やりたいならJavaC#でいいじゃん。

Perl5には本格的なOOPの仕組みが実装されていない。

継承という基本的な概念もないし、コンストラクタなんかも用意されていない。ゆえに、MooseとかのCPANモジュールを使って実装しなければいけないのだけれど、その分敷居が高くなって初心者には判りづらい。初心者でも現場に投入できるような、強力なオブジェクト指向機構が用意されているJavaC#といった言語StrutsASP.NETといったフレームワークなんかとは全然違う。

私はメインPHPASP.NET(C#)という人間で、Perlバッチプログラムとかクローラの実装とか雑用処理なんかに使っている。PHPは小規模プロジェクトアジャイルな開発がしたい時、ASP.NETは大規模プロジェクトに呼ばれた時用の懐刀という感じで使い分けている。PerlWebサービスを作ることももちろん出来るけれども、どちらかというとスピードが優先される開発に用いるものだと思うし、OOPを用いた大規模なプロジェクトPerlを使おうとする理由がよく判らない。無駄に難しいし、そもそも本書を読めるレベルPerlを理解している人の頭数がかなり少ないだろうから、実装しても保守コストがやたらかかる。Livedoormixiはてなのような大規模サイトPerlで動いているようだが。。。

モダンPerl入門』は内容も書き方も素晴らしい良書だけれど、その辺りが引っかかった。「PerlOOPを使う理由(APS.NETStruts+Java採用しない理由)」は何なのだろうか? 私のプログラマーとしてのスキルが低いだけだと思うが、よく判らないので誰か教えてくだしあ。教えてダンコーガイ

2008-07-04

javascript継承

javascriptスーパークラスのメソッドを簡単に呼び出したかった。それだけだった。

思いのほか長くなった。車輪を再発明した気がする。

var Class = inherit(SuperClass, {hoge: ...});

のように使い、スーパークラス継承したクラスを作る。

作ったクラスprototypeに、第二引数オブジェクトコピーされたスーパークラスインスタンスを持つ。

第一引数がnullだと、スーパークラスObjectを用いる。つまり、

var Class = inherit(null, {hoge: ...});

var Class = inherit(Object, {hoge: ...});

と同等となる。

また、第一引数が"prototype"をメンバに持たない普通オブジェクト、つまり、

var Class = inherit({hoge: ...});

だと

var Class = inherit(Object, {hoge: ...});

と同等となる。

var obj = new Class({hoge: ...});

インスタンスを作ると、引数オブジェクトコピーを持つオブジェクトとなる。

また、メソッド"initialize"が自動的に実行される。

ただし、コンストラクタ引数を渡さなかった場合は、initializeは実行されない。

オーバーイドしたメソッド内では

this.superapply(arguments);

としてスーパークラスのメソッドを呼べる。第一引数は呼び出すメソッドの引数配列とする。

このとき、呼び出し側のメソッドはコンストラクタやinheritでオーバーイドしたメソッドでなくてはならない。これは呼び出し側のメソッド名を記録する必要があるためである。

そうでない場合は第二引数にメソッド名を渡す必要がある。

var obj = new Class({});
obj.foo = function(){
        this.superapply(arguments);         // X
        this.superapply(arguments, "foo");  // O
};

<html><head>
<script type="text/javascript">
function inherit(superclass, override) {
	if (!superclass)
		superclass = Object;
	if (! "prototype" in superclass) {
		override = superclass;
		superclass = Object;
	}
	var that;
	var func;
	function superapply(arg, name) {
		var prev = {that: that, func: func};
		try {
			var my = this.superapply;
			if (!arg)
				arg = [];
			if (!name)
				name = arguments.callee.caller.caller.methodName;
			if (that &amp;&amp; func &amp;&amp; (!name || name == func.methodName)) {
				that = that.superapply.obj;
				name = func.methodName;
			} else if (name) {
				that = my.obj;
				func = arguments.callee.caller.caller;
				func.methodName = name;
			} else {
				throw new Error("methodName is null");
			}
			var result;
			if (func === that[name]) {
				result = this.superapply(arg, name);
			} else {
				func = that[name];
				func.methodName = name;
				result = func.apply(this, arg);
			}
		} finally {
			that = prev.that;
			func = prev.func;
		}
		return result;
	};
	var prototype = new superclass();
	prototype.superapply = function(){superapply.apply(this, arguments)};
	prototype.superapply.obj = superclass.prototype;
	if (override)
		for (var i in override) {
			prototype[i] = override[i];
			if (typeof override[i] == "function")
				prototype[i].methodName = i;
		}
	var subclass = function(obj) {
		this.superapply = function(){superapply.apply(this, arguments)};
		this.superapply.obj = prototype;
		if (obj) {
			for (var i in obj) {
				this[i] = obj[i];
				if (typeof obj[i] == "function")
					this[i].methodName = i;
			}
			this.initialize();
		}
	};
	subclass.prototype = prototype;
	subclass.prototype.constructor = subclass;
	return subclass;
}
var C1 = inherit(Object, {
fn: "C1",
initialize:
	function(){
		alert("C1.initialize");
		this.second(this.fn);
	},
second:
	function(a){
		alert("C1.second: "+a);
	}
});
var C2 = inherit(C1, {
fn: "C2",
initialize:
	function(){
		alert("C2.initialize");
		this.superapply();
//	},
//second:
//	function(a){
//		alert("C2.second: "+a);
//		this.superapply([a]);
	}
});
var C3 = new C2({
fn: "C3",
//initialize:
//	function(){
//		alert("C3.initialize");
//		this.superapply();
//	},
second:
	function(a){
		alert("C3.second: "+a);
		this.superapply([a]);
	}
});
</script>
</head><body>
</body><html>

methodNameなんとかならんもんか。

2008-04-09

JSON根本的な脆弱性

この間どっかの記事で見つけて(これ自体は数年前から海外では言われていたことだが)ターゲットを探そうと頑張ってたんだけどいろいろと理由があってここで公開することにする。

javascriptは以下のようにコンストラクタを再定義できる。

function Array() {
    var obj = this;
    var ind = 0;
    var getNext = function(x) {
        obj[ind++] setter = getNext;
        if (x) {
            console.log(x.toString());//細工。
        }
    };
    this[ind++] setter = getNext;
}

実はこれが問題で例えば、配列を含むオブジェクトJSONで渡す際に必ずArrayコンストラクタが呼び出される。

上記のように少し細工をしておけばcallbackとかついてなくても内容を処理できるのでクロスドメイン対策がされている場合でもJSONからデータを読み取ることが出来る。

余談だが、Gmailなどではこれを回避するためにwhile 1を先頭につけることで無限ループさせている。

ちなみに公開する理由
  • Firefox3はこれを仕掛けることが出来ない
  • はまちちゃんのようにいいターゲットを見つけることが出来なかった
    • いや、ひとつ見つけたんだけどあまりにも(ry
  • これとかを見る限り知っている人が少なそうだったから

2008-03-14

public class Main {
    public static void main( String[] args ) {
        // ( 5 - 3 ) + 1
        Exp exp = new Add(new Sub(new Num(5), new Num(3)), new Num(1));
        System.out.println(exp.eval());
    }
}


/**
 * 抽象クラス
 */
abstract class Exp {
    public abstract int eval();
}


/**
 * 足し算
 */
class Sub extends Exp {

    /** 左辺 */
    private Exp hidari;
    /** 右辺 */
    private Exp migi;

    /**
     * コンストラクタ
     */
    public Sub(Exp hidari, Exp migi){
        this.hidari = hidari;
        this.migi = migi;
    }

    /**
     * 評価
     */
    @Override
    public int eval() {
        return hidari.eval() - migi.eval();
    }

}


/**
 * 引き算
 */
class Add extends Exp {

    /** 左辺 */
    private Exp hidari;
    /** 右辺 */
    private Exp migi;

    /**
     * コンストラクタ
     */
    public Add(Exp hidari, Exp migi){
        this.hidari = hidari;
        this.migi = migi;
    }

    /**
     * 評価
     */
    @Override
    public int eval() {
        return hidari.eval() + migi.eval();
    }
}


/**
 *
 */
class Num extends Exp {

    /**
     *
     */
    private int self;

    /**
     * コンストラクタ
     */
    public Num(int self) {
        this.self = self;
    }

    /**
     * 評価
     */
    @Override
    public int eval() {
        return self;
    }

}

2007-06-04

[]??Delphihacks??Delphi??Win32API??

Delphi - Wikipedia??Windows開発の決定版 - Delphi(Skype??なでしこ)

タグ「delphi」を含む注目エントリー - はてなブックマーク

Delphiアプリケーションのメモリリーク検出法

Delphiアプリケーションのメモリリーク検出法 (山本隆の開発日誌)

作ろう!コンポーネント Delphi C++Builder

http://www.componentsource.co.jp/features/delphi/

TMS Software | Productivity software building blocks

Components > Effects and Multimedia > Video. Torry's Delphi Pages

Components > Effects and Multimedia > Audio. Torry's Delphi Pages

Components > Effects and Multimedia > Voice. Torry's Delphi Pages

Components > Effects and Multimedia > Direct X. Torry's Delphi Pages

try finally end

CとDelphiの対比表

eXeScope(Windows95/98/Me / ユーティリティ)

Delphi - テクノラティブログ検索

2ch検索: [Delphi]

Delphi-ML〓〓〓〓〓〓〓〓〓〓〓??About Delphi

Delphi Q & A掲示板

Delphi Q & A 〓f〓〓〓〓 〓〓〓〓〓〓O〓〓(HTML〓o〓[〓W〓〓〓〓)

fdelphi.com

Delphi入門

旧 Delphi 入門??Seventh Delphi

Delphiメモ

超ローテクDelphi講座

俺のためのDelphi学習

Delphi はじめの一歩

VB〓〓VC〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓H

Delphi の格言

キーボードからの入力取得

マウスボタンのクリック、マウスの位置情報の取得

ジョイスティックからの入力取得

バッカーへの階段: 入門:キーロガー

テキストファイルを読み書きする

テキストファイルのロードとセーブ

DelphiによるWin32API

Delphi WAVEサウンド音を鳴らす/Tips & Tricks

MIDI、WAVEファイルを再生する

サウンドを読み込んで鳴らす

MIDIを演奏する MCI/midiStream

5分ではじめるDelphi - 第1回 簡単なメディアプレーヤの作成(前編)

MP3プレイヤーを作る>dllによる再生

Controling sound volume from code

Torry's Delphi Pages

lsMicrophone: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;

MIXERLINE_COMPONENTTYPE_DST_SPEAKERS

MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT

SwissDelphiCenter.ch : ...set the volume for the microphone/ mute it (enhanced)?

Components > Sound Effects > Mixer. Torry's Delphi Pages

uses MMSystems;

//

PlaySound('C:\WINNT\Media\start.wav', 0, SND_FILENAME or SND_ASYNC);


ビットマップを表示しよう

画像ファイルを指定した位置へ表示

俺Delゲーム応用

画面をキャプチャして表示する

めもニャンだむ

Delphi6でプログラミング ビットマップの半透明コピー AlphaDraw

画像処理プログラミング講座

Graphic Effect

カラー画像をモノクロ画像に変換

procedure TForm1.Button1Click(Sender: TObject);

var

bmp1,bmp2 :TBitmap;

begin

bmp1 :=Tbitmap.Create;

bmp2 :=Tbitmap.Create;

try

bmp1.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color\FINANCE.BMP');

bmp2.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color\FACTORY.BMP');

Form1.Canvas.Draw(10,10,bmp1);

Form1.Image1.Canvas.Draw(10,10,bmp2);

finally

bmp1.Free;

bmp2.Free;

end;

end;


無料版Delphi6でSTGをつくるためのプログラミング講座 Ver.2005 Jan.

Delphiでわずか59KBのオセロを作る方法

めもニャンだむ:BIOS 情報

コンストラクタとデストラクタ

SwissDelphiCenter.ch : ...get the MAC Address?

乱数

DelphiでMD5

もっと楽にGUIとの連携がしたい:Python + Delphi = P4D(Python for Delphi) - ふにゃるん

Delphi WindowsのOSのバージョンを取得する/Tips & Tricks

SourceForge.net: Gecko SDK for Delphi

DelphiでWinSock

SQLite-もげもげ〜

BDS(Delphi/BCB)用SQLiteライブラリ (山本隆の開発日誌)

Application.ProcessMessages

FrontPage - DelphiVIP

SwissDelphiCenter.ch : programming tips

Torry's Delphi Pages

Delphi Tips

Delphi Code Tips

Magic of Delphi4〓z〓[〓〓 〓y〓[〓W

Delphi Win32API/API関数一覧

Delphi〓〓〓Z

クジラ式 Delphi 資料

Delphi〓〓y〓[〓W

サイト移転のお知らせ(Mr.XRAY)

openDelphi.org

KOL and MCKPage

Gen's Delphi Labo.

サイト移転のお知らせ(Mr.XRAY)

ナッキーの「Turbo Delphiはじめて奮戦記」- 第1回 Turbo Delphi のインストール

フリーのTurbo Delphiで始めるWindowsプログラミング:ITpro

フリーのTurbo Delphiで始めるWindowsプログラミング:ITpro

http://torrent.borland.com/turbo_hotfix_rollup.zip

http://torrent.borland.com/prereqs_jp.zip

http://torrent.borland.com/turbodelphi_jp.exe

(1) \dotNETRedist\dotnetfx.exe

(2) \dotNETRedist\langpack.exe

(3) \dotNETRedist\NDP1.1sp1-KB867460-X86.exe

\dotNETSDK\setup.exe

\IE60SP1\ie6setup.exe

\dotNETJSharp\vjredist.exe

\dotNETJSharp\vjredist-このエントリーをはてなブックマークに追加ツイートシェア

2007-05-11

http://anond.hatelabo.jp/20070510174446

public class FizzBuzz {
	private final int start;
	private final int last;
	private final int fizz;
	private final int buzz;

	public FizzBuzz(int start, int last, int fizz, int buzz) {
		this.start = start;
		this.last = last;
		this.fizz = fizz;
		this.buzz = buzz;
	}

	public static void main(String[] args) {
		new FizzBuzz(1, 100, 3, 5).execute();
	}

	private void execute() {
		for (int i = start; i <= last; i++) {
			if(isMultiple(i, fizz)){
				System.out.println("Fizz");	
			}
			if(isMultiple(i, buzz)){
				System.out.println("Buzz");			
			}
			if( !isMultiple(i, fizz) && !isMultiple(i, buzz)){
				System.out.println(i);			
			}
		}
	}

	private boolean isMultiple(int i, int base) {
		if(i/base * base == i){
			return true;
		}
		return false;
	}
}

勝手に修正してみた。

Javaクラスってコンストラクタとデストラクタって必須じゃなかったっけ?

あ、CならisMultipleは#defineするから一行で済むんだが…。

2007-02-08

anond:20070208102527

増田でこんな風にだべるのも一興ですな。

言語としてのPerlRuby比で誉めるのは無理。

んー、誉めてる様に読めるのかなぁ。好きって意味では書いたけど、それは利点というより欠点っぽい気がするんだよな。特に設計の立場で考えると。

設計という観点を持たないコーディングが可能って考え方は斬新すぎて理解できないけど。

設計という観点での評価とコーディングという観点での評価、どちらを重視するか、って事です。

「とりあえず書いてみる」→「不具合アドホックで直す」→「だんだんソースがぐちゃぐちゃになる」

人にも拠るだろうが、趣味で書くとそんな感じになったりする。で、perlの場合は変態的なことも出来ちゃったりするので余計にたちが悪いと思うわけ。書く時には出来ちゃう事が利点なんだけどね。

大体、オブジェクトがなってないよね。newしたら別のオブジェクト作っちゃうとか。別のオブジェクトに変更しちゃうとか。しまいにはコンストラクタじゃないところでコンストラクトしちゃうとか。

あー書いてたらわけわかんない文になったけど書き散らしとこう。

 
アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん