目录
一、背景描述
面试官前一天晚上给我发了一篇全英文的文章《Clean Coder Blog》让我第二天讲一下感悟。第一次接触这样的面试,心里没有底,那天晚上肝到1点写了一页的稿子,第二天6点就起床了,那时住地下室特别冷,根本不想起,还是坚持起床了,毕竟我还挺喜欢创业公司的。最后到答的时候紧张得一批,还是没有答好,但是面试官很nice,我也学了很多东西。
二、借助前人的翻译
一开始比较刚是自己翻译,后来在网上找到了译文,这对于我快速理解有很大帮助。《框架整洁之道译文》
三、我的理解
我第一时间想到的就是MVC和MVT两种模式,就应证了只一个整洁的框架的依赖规则,但是认为它是只是第3层接口适配层,框架的作用只是给数据库,模板搭建了沟通的桥梁。重点是去理解第一层和第二层,第一层是实体层,实体能被公司的不同业务逻辑部件使用,实体的具体表现形式是无所谓的,有这样特点的就是抽象函数和抽象类或者是数据结构,例如我有一个抽象的Person类,里面有一个抽象的eat方法,吃就是要完成的业务,第二层是把第一层的内容进行实现,就是指具体怎么去吃,是狼吞虎咽还是细嚼慢咽?用例层是在我们的软件中实现用例的位置,这些用例是由于软件用户希望实际上对基础域的实体“做某事”而产生的。例如一个示例可能是“客户将商品添加到订单中”。为了实现此用例和其他用例,需要使业务实体动起来的方法。第三层,往里走是业务往外走是页面,有点像是MVT的view,MVC的control,则处理传入的HTTP请求的控制器将位于接口层中,因为它们形成了HTTP服务器与应用程序层之间的接口。
举一个例子我第四层传进来的是applicationJson形式的数据{‘user_id’:1},但是我第二层需要的是一个user的对象,第三层的作用就是进行适配,把user_id转换成user对象,例如flask一个登录函数的post方法:
def post(self):
form = LoginForm(request.form)
if form.validate():
# 第4层传进来的信息
email = form.email.data
password = form.password.data
remember = form.remember.data
# 第3层转换
user = CMSUser.query.filter_by(u_email=email).first()
# 第2层的check_password业务
if user and user.check_password(password):
session[config.CMSUSER_ID] = user.u_id
if remember:
session.permanent = True
return redirect(url_for("cms.cms_index"))
# 第3层又传给第4层信息
else:
return self.get(messages="用户名或密码错误")
else:
messages = form.errors.popitem()[1][0]
print(messages)
return self.get(messages=messages)
所以可以拆出来放到login_check.py文件中,因为只有一个方法所以就不写成类的形式了。
from apps.cms.models import CMSUser
from flask import session, url_for, redirect
import config
def login_check(email, password, remember):
"""
通过传进来的email查询user对象,查询到返回True
:param email:邮箱 :type email:str
:param password: 密码 :type password:str
:param remember: 记住密码 :type: int
:return: 判断结果 :type:boolean
"""
user = CMSUser.query.filter_by(u_email=email).first()
if user and user.check_password(password):
session[config.CMSUSER_ID] = user.u_id
if remember:
session.permanent = True
return True
else:
return False
而controler里的代码相应修改:
class LoginView(views.MethodView):
def get(self, messages=None):
return render_template("cms/cms_login.html")
def post(self):
form = LoginForm(request.form)
if form.validate():
email = form.email.data
password = form.password.data
remember = form.remember.data
if login_check(email, password, remember):
return redirect(url_for("cms.cms_index"))
else:
return self.get(messages="登录名或密码错误")
else:
messages = form.errors.popitem()[1][0]
print(messages)
return self.get(messages=messages)
以上是我的拙见,有什么意见Thanks♪(・ω・)ノ
Unyielding_L一直劝我不要发这篇文章,因为我的代码例子写的很烂,我在github上面搜到的flask电商项目也是把业务耦合到views里面,所以我觉得自己不是最烂的,最好就是有人抬杠,我才知道最后怎么写好这篇文章,Unyielding_L说你发布了就不要说是他审核的,好绝情的男人哦!
审核:lzq@Unyielding_L@Unyielding_L@Unyielding_L@Unyielding_L@Unyielding_L@Unyielding_L