Shammer's Philosophy

My private adversaria

Python に冗長なコードを出力してもらう

問題点

オブジェクト指向でコードを書いていて退屈してくるのが ValueObject の記述。フィールドがあって、そのフィールドに対するアクセサを書く。2 つとか 3 つくらいならいいけれども、フィールドが 10 とかあるとうんざりしてくる。しかも同じようなコードばかり。ここでいくつかの解決策が思い浮かぶ。

  • コピー&ペーストして、変更すべきところをちょっとだけ変更
  • IDEの機能で一括して書いてもらう
  • スクリプトで書く

最初のやつは原始的で直感的だが、数が多いと漏れとかも発生しやすいという欠点も。
IDEは対応していればいいけれどもそもそもIDEを使用しない主義の人とかもいるので万能とは言えない(もちろん、使えるなら一番楽で確実)。
そこで 3 つ目のスクリプトで書いてもらうやり方。これは文字列を同じような順番で組み合わせるのでシェルだと面倒だった(というか、一度変数に格納するやり方しか出てこなかった)。何もシェルでなくても pythonインタプリタとして使えばできるので、シェルでのやり方を探すより早いと判断。

Pythonのコード例

以下のような感じ。

>>> for i in ['a','b','c','d','e','f','g','h','i','j']:
...     print ';;;;;'
...     print ';;;;; accessor for ' + i
...     print ';;;;;'
...     print '(defmethod get-' + i + '((obj class))'
...     print '  (slot-value obj \'' + i + '))'
...     print '(defmethod set-' + i + '(value (obj class))'
...     print '  (setf (slot-value obj \'' + i + ') value))'
...
;;;;;
;;;;; accessor for a
;;;;;
(defmethod get-a((obj class))
  (slot-value obj 'a))
(defmethod set-a(value (obj class))
  (setf (slot-value obj 'a) value))
;;;;;
;;;;; accessor for b
;;;;;
(defmethod get-b((obj class))
  (slot-value obj 'b))
(defmethod set-b(value (obj class))
  (setf (slot-value obj 'b) value))
;;;;;
;;;;; accessor for c
;;;;;
(defmethod get-c((obj class))
  (slot-value obj 'c))
(defmethod set-c(value (obj class))
  (setf (slot-value obj 'c) value))
;;;;;
;;;;; accessor for d
;;;;;
(defmethod get-d((obj class))
  (slot-value obj 'd))
(defmethod set-d(value (obj class))
  (setf (slot-value obj 'd) value))
;;;;;
;;;;; accessor for e
;;;;;
(defmethod get-e((obj class))
  (slot-value obj 'e))
(defmethod set-e(value (obj class))
  (setf (slot-value obj 'e) value))
;;;;;
;;;;; accessor for f
;;;;;
(defmethod get-f((obj class))
  (slot-value obj 'f))
(defmethod set-f(value (obj class))
  (setf (slot-value obj 'f) value))
;;;;;
;;;;; accessor for g
;;;;;
(defmethod get-g((obj class))
  (slot-value obj 'g))
(defmethod set-g(value (obj class))
  (setf (slot-value obj 'g) value))
;;;;;
;;;;; accessor for h
;;;;;
(defmethod get-h((obj class))
  (slot-value obj 'h))
(defmethod set-h(value (obj class))
  (setf (slot-value obj 'h) value))
;;;;;
;;;;; accessor for i
;;;;;
(defmethod get-i((obj class))
  (slot-value obj 'i))
(defmethod set-i(value (obj class))
  (setf (slot-value obj 'i) value))
;;;;;
;;;;; accessor for j
;;;;;
(defmethod get-j((obj class))
  (slot-value obj 'j))
(defmethod set-j(value (obj class))
  (setf (slot-value obj 'j) value))
>>>