使用elif分支代替映射简化设计
2017-07-07 00:46
169 查看
在Python的程序设计中,字典这样的映射程序总是可以用elif结构来代替。通常,这样可以使得设计获得更好的一致性。例如,之前有代码如下:
#!/usr/bin/python
class Card:
def __init__(self,rank,suit):
self.suit = suit
self.rank = rank
self.hard,self.soft =self._points()
classNumberCard(Card):
def _points(self):
returnint(self.rank),int(self.rank)
classAceCard(Card):
def _points(self):
return 1,11
classFaceCard(Card):
def _points(self):
return 10,10
class Suit:
def __init__(self,name,symbol):
self.name = name
self.symbol = symbol
defcard(rank,suit):
if rank == 1:
return AceCard('A',suit)
elif 2 <= rank < 11:
return NumberCard(str(rank),suit)
elif 11 <= rank < 14:
name ={11:'J',12:'Q',13:'K'}[rank]
return FaceCard(name,suit)
else:
raise Exception("Rank out ofrange")
在实现card工厂函数的时候,上面的代码中使用了映射。此函数可以进行修改,设计为如下方式:
defcard(rank,suit):
if rank == 1:
return AceCard('A',suit)
elif 2 <= rank < 11:
return NumberCard(str(rank),suit)
elif rank == 11:
return FaceCard('J',suit)
elif rank == 12:
return FaceCard('Q',suit)
elif rank == 13:
return FaceCard('K',suit)
else:
raise Exception("Rank out ofrange")
通过上面的修改,虽然代码长度有所增加,但是代码获得了更好的一致性。相比之下,如果是用于处理简单的情况,通常使用字典这样的映射会更为高效地工作也具有更好的可读性。但是elif分支的实现方式,能够更为一致性的结构和更清晰的实现意图。
#!/usr/bin/python
class Card:
def __init__(self,rank,suit):
self.suit = suit
self.rank = rank
self.hard,self.soft =self._points()
classNumberCard(Card):
def _points(self):
returnint(self.rank),int(self.rank)
classAceCard(Card):
def _points(self):
return 1,11
classFaceCard(Card):
def _points(self):
return 10,10
class Suit:
def __init__(self,name,symbol):
self.name = name
self.symbol = symbol
defcard(rank,suit):
if rank == 1:
return AceCard('A',suit)
elif 2 <= rank < 11:
return NumberCard(str(rank),suit)
elif 11 <= rank < 14:
name ={11:'J',12:'Q',13:'K'}[rank]
return FaceCard(name,suit)
else:
raise Exception("Rank out ofrange")
在实现card工厂函数的时候,上面的代码中使用了映射。此函数可以进行修改,设计为如下方式:
defcard(rank,suit):
if rank == 1:
return AceCard('A',suit)
elif 2 <= rank < 11:
return NumberCard(str(rank),suit)
elif rank == 11:
return FaceCard('J',suit)
elif rank == 12:
return FaceCard('Q',suit)
elif rank == 13:
return FaceCard('K',suit)
else:
raise Exception("Rank out ofrange")
通过上面的修改,虽然代码长度有所增加,但是代码获得了更好的一致性。相比之下,如果是用于处理简单的情况,通常使用字典这样的映射会更为高效地工作也具有更好的可读性。但是elif分支的实现方式,能够更为一致性的结构和更清晰的实现意图。
相关文章推荐
- 使用 Servlet API 简化设计
- 使用泛型程序简化代码设计
- LevelDB源码分析--使用Iterator简化代码设计
- Web 设计新趋势: 使用 SVG 代替 Web Icon Font
- SVN分支和映射总结和数据库初步使用
- 使用主动实体(ActiveEntity)简化继承体系映射类的写操作
- php 设计模式(注册器模式+工厂模式+数据库映射模式,单例模式+工厂模式+注册器模式混合使用)
- 使用前端框架Foundation 4来帮助简化响应式设计开发
- 使用前端框架Foundation 4来帮助简化响应式设计开发
- 使用枚举代替常量,简化工作!
- 使用Hibernate做一对多的实体映射(使用面向对象的方式设计表)
- Android歌词秀设计思路(6)运用Proxy设计模式简化歌词播放服务的使用
- Android歌词秀设计思路(6)运用Proxy设计模式简化歌词播放服务的使用
- SqlBulkCopy excel 字段映射解决办法二 使用数字索引代替 字段名称 做映射 避免字段中有中文 大小写等情况
- 设计模式之 使用静态工厂模式代替构造函数(Java)
- ◎使用脚本部件向导简化WSC设计
- 使用线框图来简化你的产品设计流程
- 把&nbsp;映射到xml中本来就该使用&#160来代替
- Web 设计新趋势: 使用 SVG 代替 Web Icon Font
- 【SSH 框架项目的搭建--简化版】使用注解代替xml中的<bean>,减少代码量