2010-09-13 32 views
3

我写了一个网址路由器在Python 3.1,不知是否是多口味的问题使用下列变量之一:构造PARAMS与方法调用

元组作为构造PARAMS:

router = Router( 
    (r"/item/{id}", ItemResource()), 
    (r"/article/{title}", ArticleResource()) 
) 

方法调用

router = Router() 
router.connect(r"/item/{id}", ItemResource()) 
router.connect(r"/article/{title}", ArticleResource()) 

你看不到任何优势或总排行ges在这里?

回答

2

我赞成传递元组构造的原因有两个亚历克斯没有提及(至少没有明确)。

  1. 可读性。如果对于代码的任何读者都清楚,Router实例需要一个可用的路由列表。

  2. 失去耦合。客户端代码不必担心初始化路由器实例。这是Router类的职责。

如果这是笨重的感觉给你,我会建议打破路由器全班分成更小的类,然后把这些类的实例Router.__init__。例如,在这里你可以有一个RoutesList类:

routes = RoutesList((r"/item/{id}", ItemResource()), 
        (r"/article/{title}", ArticleResource())) 

router = Router(routes) 

这买你两期建设亚历克斯提到的灵活性,而且还可以防止客户端代码被从初始化路由器类负责。这仍然保留可读性,因为您必须向后阅读以查看什么是routes,而不是转发(如果您没有记住)。它还有一个额外的优点,即如果你决定改变你如何表示你的路由,那么Router类应该不必改变:所有这些改变应该被封装在RoutesList类中(或者甚至可以在未定义路由类)。

或路线可能仅仅是一个元组列表,你可以有一个模块级功能映射到控制器的路线;)

0

除非该参数是强制性的,否则您可以使用方法调用方法,如果您将来需要添加更多方法,该方法会更加灵活。

如果您的实例必须同时使用这两个参数才能生效,请使用构造函数方法。

2

传统的OOP视图是构造函数应该保证一个对象处于最终的可用状态 - 也就是说,状态可能会发生变化,当然,如果有动态变化的需求(例如有一个disconnect方法去与connect,以及一个实际的应用程序的要求,以使在操作过程中路由的动态变化?),但它“应该”保持可用,从物体出生到它消失的时刻。

在现实世界中,有时也被称为“两阶段建设”的可选模式(尽管这可能不仅仅是两个过程阶段,因为你一直在打connect ;-)可能有一定的优势灵活性 - 持久化和持久化对象,依赖于配置文件构建它们,缓解依赖注入和嘲讽(因此测试)。

无论你实际上利用这些灵活性方面的优势的时候,是你能回答好于我们......既然你最好知道OO开发应用的具体要求和自己的技能和喜好的问题,测试,& c。如果你是而不是,实际上,要使用灵活性方面,那么完全省略它们就更简单了,并且采用“传统的自给式构造函数”OOP方法。

+0

没有什么在OOP,说所有的对象是只读的,并在他们的最后施工后的状态。可用,是的,但空路由表可用,但不是很有趣。 – stonemetal 2010-09-13 19:16:10

+0

@stone,正如我所说的,“当然,国家可能会发生变化”(否则我们会考虑FP,而不是OOP ;-)。 – 2010-09-14 00:04:44

0

由于您正在构建路由器以将Web请求路由到适当的资源,因此您还可以查看路由。它允许您将URL映射到应用程序的操作。

+0

谢谢,我知道路线,但它不符合我的需求。 – deamon 2010-09-13 18:28:31

相关问题