Skip to content

四火的唠叨

一个纯正程序员的啰嗦

Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接
Menu

由后端来类比前端设计的思考

Posted on 11/24/201106/23/2019 by 四火

design 有这样一句话被提起:

前端也有 MVC,DOM 树就是这个 M,CSS 就是这个 V,至于 C,非 JavaScript 莫属。

很高兴团队中有越来越多的人能够跳出某种语言、某种平台的局限性,站到抽象的层次上思考一些设计上的问题。在我的印象中,似乎前端开发总是容易给人以随意、混乱的感觉,可真的是前端技能不容易掌握吗?

大学里 Java 课程正儿八经学了 3 年,JavaScript 只字未提,只是课余时间凭借着兴趣自学,加起来也就两三个月。

前端代码更加灵活,无论是 HTML、JavaScript 还是 CSS,似乎任何一个初学者都可以轻松入门。可是越是看似简单的东西,就越难以精通地掌握,没有好的设计来引导,如果技能不过硬,很容易陷入混乱的困顿之中。

回到标题,来看看怎么从后端设计来类比前端设计。

一、模型和业务逻辑的分离:

写后台代码,模型层是很容易划分出来的,模型的建立是整体设计的第一步,美工在设计页面时,最关注一个页面最宏观的盒子模型;而 Service 层,适合存放业务逻辑,它们可以做到无状态和池化的。

前端开发呢,当 JQuery 或类似的框架出现以后,DOM 模型就可以完全和业务方法分离开了,通过这样美妙的绑定代码来完成关联和解耦:

$("#userName").click(function(){  
    ……  
});  

二、让视图层独立:

通常不要使用内联 CSS 和嵌入 CSS,视图层要让经验丰富的美工管理起来。

三、找到一个合适的切面来做接口层:

还是这几行代码:

$("#userName").click(function(){  
    ……  
});  

我们来换一个角度思考:

userName 就好像是 Java 中的接口,click 就好比是接口中的方法,如果这两个东西是既定不变的,接口的实现类当然可以随意更换了啊。

这个让我想起了 Spring 的 IoC,把对象的管理和控制权交给容器去完成—— 那么在前端,就把这个权利交给了 JQuery 的绑定逻辑去完成。

如果功能类似的页面,要求更换几套不同的效果,那么保持一个清晰的接口层,围绕接口层去完成不同的实现模板,将是一个值得尝试的方式:

//实现类一:
$("userName").click(function(){  
    alert("U Click Me"); //模板一的实现
});  
……  

//实现类二:
$("userName").click(function(){  
    $("userTypeFont").attr("color","RED"); //模板二的实现
});  
……  

在这种情形下,接口层 DOM 的 id 和职责方法都被固定下来,开发人员可以按照接口开发、美工可以按照接口层在盒子模型中完善页面设计、测试可以按照接口来写自动化用例,这一切可美好多了!

四、针对接口来编排业务逻辑:

第三条已经建立了合适的接口层,那么相对固定的界面效果和逻辑,就可以通过桥接模式下对接口的引用来完成了。即便更换了关系到展现效果的模板,核心 JavaScript 都不会变化。

五、分离模板和数据:

模板和数据的整合,似乎是后端应该做的事,例如 FreeMarker 模板和数据的整合,最终形成页面。

现在,这件事情在前端也可以完成了:

(1)生成相对静态的模板:

<div id="userName">${user.userName}</div>

(2)Ajax 获取到模板的数据:

{"user":{"name":"James"}}  

(3)浏览器端聚合,搞定最后的页面:

<div id="userName">James</div>  

这样做的静态模板的很容易在缓存中命中,而数据的生成也非常灵活,最后,聚合是在客户端完成的,这方面对服务端没有压力,因此性能往往非常高。

六、归纳一下:抽象,是软件设计的核心艺术。即便前端设计,也一样。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

你可能也喜欢看:

  1. 关于接口设计,还有 Fluent Interface,这种有趣的接口设计风格
  2. JavaScript 实现继承的几种方式
  3. 几道容易出错的 JavaScript 题目
  4. 也谈谈全栈工程师
  5. 前端解耦的一个最简单示例

4 thoughts on “由后端来类比前端设计的思考”

  1. 一枚蜗牛 says:
    09/06/2012 at 6:07 PM

    用前端模板的话,SEO 方面会不会有所欠缺呢~?

    Reply
    1. 四火 says:
      09/06/2012 at 11:21 PM

      数据是异步获取的,我不知道搜索引擎对于 ajax 请求的处理方式是什么。如果你知道的话告诉我 :)

      这是一个好问题。

      Reply
      1. 冯大宝 says:
        04/19/2013 at 12:23 PM

        你可以用一个锚标记 #加上名称来表示 Ajax 获取数据后的页面,比如 raychase.net/169#123, 但是要保证直接用这个 URL 访问也可以获得同样的内容。就像 twitter 那样,google 会收录的。

        Reply
        1. 四火 says:
          04/19/2013 at 6:07 PM

          嗯

          Reply

Leave a Reply to 冯大宝 Cancel reply

Your email address will not be published. Required fields are marked *

订阅·联系

四火,啰嗦的程序员一枚,现居西雅图

Amazon Google Groovy Hadoop Haskell Java JavaScript LeetCode Oracle Spark 互联网 亚马逊 前端 华为 历史 同步 团队 图解笔记 基础设施 工作 工作流 工具 工程师 应用系统 异步 微博 思考 技术 数据库 曼联 测试 生活 眼界 程序员 管理 系统设计 缓存 编程范型 美股 英语 西雅图 设计 问题 面向对象 面试

分类

  • Algorithm and Data Structure (30)
  • Concurrency and Asynchronization (6)
  • System Architecture and Design (43)
  • Distributed System (18)
  • Tools Frameworks and Libs (13)
  • Storage and Data Access (8)
  • Front-end Development (33)
  • Programming Languages and Paradigms (55)
  • Testing and Quality Assurance (4)
  • Network and Communication (6)
  • Authentication and Authorization (6)
  • Automation and Operation Excellence (13)
  • Machine Learning and Artificial Intelligence (6)
  • Product Design (7)
  • Hiring and Interviews (14)
  • Project and Team Management (14)
  • Engineering Culture (17)
  • Critical Thinking (25)
  • Career Growth (57)
  • Life Experience and Thoughts (45)

推荐文章

  • 聊一聊分布式系统中的时间
  • 谈谈分布式锁
  • 常见分布式系统设计图解(汇总)
  • 系统设计中的快速估算技巧
  • 从链表存在环的问题说起
  • 技术面试中,什么样的问题才是好问题?
  • 从物理时钟到逻辑时钟
  • 近期面试观摩的一些思考
  • RSA 背后的算法
  • 谈谈 Ops(汇总 + 最终篇):工具和实践
  • 不要让业务牵着鼻子走
  • 倔强的程序员
  • 谈谈微信的信息流
  • 评审的艺术——谈谈现实中的代码评审
  • Blog 安全问题小记
  • 求第 K 个数的问题
  • 一些前端框架的比较(下)——Ember.js 和 React
  • 一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js
  • 工作流系统的设计
  • Spark 的性能调优
  • “残酷” 的事实
  • 七年工作,几个故事
  • 从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)
  • 一道随机数题目的求解
  • 层次
  • Dynamo 的实现技术和去中心化
  • 也谈谈全栈工程师
  • 多重继承的演变
  • 编程范型:工具的选择
  • GWT 初体验
  • java.util.concurrent 并发包诸类概览
  • 从 DCL 的对象安全发布谈起
  • 不同团队的困惑
  • 不适合 Hadoop 解决的问题
  • 留心那些潜在的系统设计问题
  • 再谈大楼扔鸡蛋的问题
  • 几种华丽无比的开发方式
  • 我眼中的工程师文化
  • 观点的碰撞
  • 谈谈盗版软件问题
  • 对几个软件开发传统观点的质疑和反驳
  • MVC 框架的映射和解耦
  • 编程的未来
  • DAO 的演进
  • 致那些自嘲码农的苦逼程序员
  • Java 多线程发展简史
  • 珍爱生命,远离微博
  • 网站性能优化的三重境界
  • OSCache 框架源码解析
  • “ 你不适合做程序员”
  • 画圆画方的故事

近期评论

  • Ticket: TRANSACTION 1.922915 BTC. Go to withdrawal >> https://yandex.com/poll/enter/BXidu5Ewa8hnAFoFznqSi9?hs=20bd550f65c6e03103876b28cabc4da6& on 倔强的程序员
  • panshenlian.com on 初涉 ML Workflow 系统:Kubeflow Pipelines、Flyte 和 Metaflow
  • panzhixiang on 关于近期求职的近况和思考
  • Anonymous on 闲聊投资:亲自体验和护城河
  • 四火 on 关于近期求职的近况和思考
  • YC on 关于近期求职的近况和思考
  • mafulong on 常见分布式基础设施系统设计图解(四):分布式工作流系统
  • 四火 on 常见分布式基础设施系统设计图解(八):分布式键值存储系统
  • Anonymous on 我裸辞了
  • https://umlcn.com on 资源链接
© 2025 四火的唠叨 | Powered by Minimalist Blog WordPress Theme