ネスト解消のためのポリモーフィズムについて


ポリモーフィズムに対する考え

evalなしのポリモーフィズムは分岐の記述を簡潔にすることはできるが、なくすことはできない
evalを使うと分岐のネストはなくせるが、恐ろしい
→あれ、pythonのevalでインスタンス化できない(そのうち調べよう およよ)

解説

一般的な分岐をなくすためのポリモーフィズムは、オブジェクト生成時点で分岐が発生してしまうように思います。ポリモーフィズムを適用すると分岐の記述は軽くなるので、当初の保守性を上げるという目的は達成できていると強弁することは可能ですが、効果を今ひとつ実感できません。
分岐を完全に断つためには、オブジェクト生成時点でeval的なことをするというアイディアがありますが、漠然とevalに不安を感じています。このあたりについてみなさんの意見を聞かせて欲しいです。
下記はポリモーフィズムというかダックタイピングですが、言いたいことは同じです。

ポリモーフィズム化前

switch.py
#そもそも分岐あり
request = param #paramはリクエストの中のパラメータと想定DogやCatが入る
if request == "Dog":
  print "wan"
elif request == "Cat":
  print "nya-"

ポリモーフィズム化後

polymorphism.py
#オブジェクト生成時点で分岐あり
class Dog:
  def foo(self):
    print "wan"
class Cat:
  def foo(self):
    print "nya-"

def make(animal):
  if animal == "Dog":
    return Dog()
  elif animal == "Cat":
    return Cat()

request = param #paramはリクエストの中のパラメータと想定 DogやCatが入る
animal = make(request)
animal.foo()

ポリモーフィズム化したものをevalでネストを解消

polymorphism_eval.py
#分岐なし
class Dog:
  def foo(self):
    print "wan"
class Cat:
  def foo(self):
    print "nya-"

request = param #paramはリクエストの中のパラメータと想定 DogやCatが入る
animal = eval(request+"()")
animal.foo()