解藕的小例子
Wiki上对MVC的定义是:MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。无论是C++的MFC,JAVA的J2EE和swing,Ruby的Ruby on Rails,还是Python的django,都可以说采用了MVC模式的思想。MVC模式中解藕是重要的一环,引用一句话“那么多的设计模式,那么多的软件架构,无非就是封装和解耦、继承和关联、多态和转型的应用。这里面,着重看一下解耦。评价一个软件结构是否合理,耦合的强弱是很重要的一个评判因素,强耦合的系统在应对变化的时候总是感觉乏力,而一个弱耦合的系统则会轻松自如。”
the django book2.0有一个解藕的小例子如下:
1 # urls.py 2 from django.conf.urls.defaults import * 3 from mysite import views 4 urlpatterns = patterns('', 5 (r'^(foo)/$', views.foobar_view), 6 (r'^(bar)/$', views.foobar_view), 7 ) 8 # views.py 9 from django.shortcuts import render_to_response 10 from mysite.models import MyModel 11 def foobar_view(request, url): 12 m_list = MyModel.objects.filter(is_new=True) 13 if url == 'foo': 14 template_name = 'template1.html' 15 elif url == 'bar': 16 template_name = 'template2.html' 17 return render_to_response(template_name, {'m_list': m_list})
urls.py对url进行配置,但是url的部分工作却在views.py中完成。如果你打算把 /foo/ 改成 /fooey/的话,那么你就得记住要去改变视图里面的代码。
解藕的方法是对url的处理只在urls.py中完成,只要传递给views.py一个参数就可以了。
1 # urls.py 2 from django.conf.urls.defaults import * 3 from mysite import views 4 urlpatterns = patterns('', 5 (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), 6 (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), 7 ) 8 # views.py 9 from django.shortcuts import render_to_response 10 from mysite.models import MyModel 11 def foobar_view(request, template_name): 12 m_list = MyModel.objects.filter(is_new=True) 13 return render_to_response(template_name, {'m_list': m_list})