« プログラミングを始めるには(14) | Main | プログラミングを始めるには(16) »

August 13, 2014

プログラミングを始めるには(15)

あたかも、プログラミングを始めるにはそれがオブジェクト指向でなければならない...ということであるかのように、みなさんはオブジェクト指向が大好きのようだ。それは、これまでに一度もプログラムを書いたことがないような禿げ頭のオッサンでさえ、本屋にそういう本がたくさん竝んでいるというだけでそのように盲信している。一體何がそんなに良いのか?

それは何となく、電氣屋でパソコンを買ったらWindowsがインストールされていて、だからそれを使っているというのと大差ない氣がする。ソフトショップへCコンパイラを買いに行ったら、VISUAL C++が賣っていたからそれを買ってきた、それが何か?というのと同樣だ。前にも書いたが、ピカピカの1年生が最初に學ぶプログラミング言語は、最初に關わった開發プロジェクトが採用するプログラミング言語と決まっているのであり、學生時代にどれほど高尙なソフトウェア工學を學んできても、そんなことはどうでも良いのだ。それに失望したら、もう會社を變わるしかない。一度そのプログラミング言語で開發したという經歷がつくと、以後その呪縛から逃れられなくなる。

オブジェクト指向に關する書籍や文獻は20年以上前からいろいろ見て來た。しかし、これは面白いなと思ったのはほとんど無い。およそ實用的でないサンプルばかりでリアリティが無いのだ。書いている人は著名な人ばかりなんだろうけど、きっとこの人たちはシステム開發なんてやったことないんじゃないだろうかと思えて來る。繰り返しになるが、普通のIT技術者がプログラマで入れられるのはせいぜい10年くらいで、その後はお拂い箱になるか、小賢しい開發管理や營業をやるしかない。その短い閒にソフト開發がどういう經緯でC言語プログラミングからオブジェクト指向プログラミングになっていったのか、そういうことを身をもって體驗出來ている幸運な人はほとんど居ないだろう。だとすれば、なるほど思える書籍、文獻が少ないのにも頷けるのではないだろうか。

しかし、延々と嫌味を言っていてもしょうがないので...何となくオブジェクト指向っぽい書き方を考えてみる。

;; This buffer is for notes you don't want to save, and for Lisp evaluation.
;; If you want to create a file, visit that file with C-x C-f,
;; then enter the text in that file's own buffer.

(setq test-object nil)

(add-to-list 'test-object
	     '(test-data
	       ((man woman) . love)
	       ((oldman sea) . anekdoten)))

(add-to-list
 'test-object
 '(run (lambda (a b &optional sym)
	 (let ((answer (assoc (list a b)
			      (cdr (assoc 'test-data test-object)))))
	   (if answer (cdr answer)
	     (setf (cdr (assoc 'test-data test-object))
		   (append
		    (cdr (assoc 'test-data test-object))
		    (list (cons
			   (list a b)
			   (or sym
			       (intern
				(read-from-minibuffer "STRING: "))))))))))))

(funcall (cadr (assoc 'run test-object)) 'man 'woman)
love

(funcall (cadr (assoc 'run test-object)) 'oldman 'sea)
anekdoten

(funcall (cadr (assoc 'run test-object)) 'mom 'son 'sexy)
(((man woman) . love) ((oldman sea) . anekdoten) ((mom son) . sexy))

もしも、オブジェクト指向がこういったことを見榮え良くラッピングするものだとしたら、こんな面倒臭いことはアホらしくてやってられないのだが、どうなんだろう。誰かに否定してほしいものだ(笑)

(setq test-object nil)

(add-to-list 'test-object
	     '(data
	       ((man woman) . love)
	       ((oldman sea) . anekdoten)))

(add-to-list
 'test-object
 '(search (lambda () (assoc 'data test-object))))

(add-to-list
 'test-object
 '(add (lambda (objdata a b &optional sym)
	 (setf (cdr objdata)
	       (append
		(cdr objdata)
		(list (cons
		       (list a b)
		       (or sym
			   (intern
			    (read-from-minibuffer "STRING: "))))))))))

(add-to-list
 'test-object
 '(run (lambda (a b &optional sym)
	 (let* ((objdata (funcall (cadr (assoc 'search test-object))))
		(answer (assoc (list a b) (cdr objdata))))
	   (if answer (cdr answer)
	     (funcall (cadr (assoc 'add test-object)) objdata a b sym))))))

(funcall (cadr (assoc 'run test-object)) 'man 'woman)
love

(funcall (cadr (assoc 'run test-object)) 'oldman 'sea)
anekdoten

(funcall (cadr (assoc 'run test-object)) 'mom 'son 'sexy)
(((man woman) . love) ((oldman sea) . anekdoten) ((mom son) . sexy))

大差ないが、ちょっと書き換えてみた。でも、こんなんで大きめの機能を書ける氣がしないし、この書き方だとedebugを使ったデバグが出來ないし、traceも見れないんじゃないだろうか。賴りになるのはエラーが出たときの*Backtrace*だけになる。なので、こんな大したことない機能でも書くのが大變だし、閒違えると原因を見付けるのがむずかしい。

もともと、オブジェクトにデータ型を尋ねることが出來るんだから多重定義なんて必要ないし、いちいちデータと機能を1個のオブジェクトに入れるといっても面倒なだけでメリットが無いような氣がする。それに、ググってもロクな情報がないということはlisperはオブジェクト指向に大した期待をしていないような氣がするのだが...。

|

« プログラミングを始めるには(14) | Main | プログラミングを始めるには(16) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/60141593

Listed below are links to weblogs that reference プログラミングを始めるには(15):

« プログラミングを始めるには(14) | Main | プログラミングを始めるには(16) »