关于软件设计:一文探究系统分析与设计的逻辑性

一、系统分析与设计的逻辑性框架在日常的工作中,「软件剖析」与「软件设计」这样的词眼常常听到,然而要真正了解「软件剖析」和「软件设计」的实质是比拟难的,它依赖极强的工作教训,又加上软件剖析与设计没有规范的程式化步骤,导致不同的人有本人不同的办法,也就造成了很多人认为软件剖析与设计是十分「空洞」,还不如写具体的代码切实,而大部分的人写的是业务型代码,被嘲弄写CRUD的代码没成就感。 软件剖析与设计如其它行业一样,具备很强的逻辑性,没有逻辑性撑持,很难做好事。比方写作,有「谋篇布局」、「起承转合」、「遣词造句」等这些「准则」和「办法」,没有洞悉到这些底层逻辑,一个高手写的文章和一个普通人写的文章,成果是天差地别。因而,首先要讲清楚的是软件剖析与设计的「逻辑性」到底是什么,下图是软件剖析与设计的逻辑全景图。 1.1 办法1.1.1 分析阶段软件剖析与设计并没有那么神秘,实质来讲还是为了解决事实的问题,和「医生看病」、「工人修车」、「厨师做菜」一样的,都须要办法作为领导,否则没有任何脉络,只能抓瞎。办法是具备普适性,只是不同的行业有各自的个性,具体落地上有差别。 既然是要解决问题,那么总得晓得问题是什么吧,就好比医生看病,做各种查看、化验,都是为了全面地理解疾病,所以第一步是须要定义好问题,然而当下很多人都疏忽了这一步,间接上来想我要用哪种中间件、哪个框架,连问题都没有定义好,间接想实现无疑是轻重倒置。 问题是现实与实现差距的矛盾,事实是不满足现实的诉求,因而,首先须要理解用户的诉求是什么,想解决怎么的问题,这也即为是需要。需要剖析最大的挑战是什么是真正想要的,就好比一个病人说了一大堆的症状,他所说的症状体现与书本上的形容有时是有出入的,定义出真正的需要至关重要,接下来就要思考通过怎么的办法去梳理分明用户需要。 用例是表白用户应用零碎实现某些指标文本化的情节形容,它强调的是用户指标、观点。咱们应该从用户指标的角度登程思考,也有的人称之为利益相关者的关注点,情理很简略,咱们做进去的软件是为了服务于用户的,不是用户想要的,就算用了多高科技的的技术也是失败的。 用例只是一个概括的形容,因而还须要细化,一个用例包含一个或多个场景,场景是参与者与零碎之间的流动和交互,比方用户下单,有下单胜利,有下单失败两个场景。因而到这里还只是分析阶段,剖析的目标是理解现状和指标,以及零碎因素组成,它不关怀如何实现做、如何实现。剖析不仅限于软件行业,其它的行业也是如此,只是在剖析过程的程式化步骤、办法不一样而已。 1.1.2 设计阶段当咱们分明地晓得要做什么之后,接下来要思考如何去实现,实现的路径有很多种,如同一百个厨师做同样的菜,做进去的成果不一样。设计阶段有两点须要思考的:一是如何将性能细化实现;另一点是如何更好地实现。第一点不论用什么办法都能够实现,难的是第二点,更好地实现是须要遵循一些章法,也须要评判体系,要不然你怎么晓得好与不好呢,常见的定量评判指标有:老本、性能、可靠性、效率等,还有一类是定性的评判指标有:开放性、体验性等。 度量的指标绝对容易,就像医生看病,看疗效、看老本,软件设计也是一样,归根到底是「多快好省」。然而软件设计的章法就简单得多,它具备很强的艺术性,正所谓「文无第一,武无第二」,比武肯定能够比出个高下,谁打赢了就是胜利一方,然而比文就难了,不能说你写的就肯定比我写的好,只是不同人的爱好不一样而已,当然这里指的旗鼓相当地比照,不同档次的比照一眼还是能看得出来的。 在设计阶段最为要害的是定义出「要害的技术问题」,个别分类两类:一是站在用户视角的设计,它重点考量的是「便捷性」和「易了解」;另一个是站在零碎层面,重点考量的是「复用性」、「扩展性」和「稳定性」。贴近用户的设计,让用户用起码的了解就能应用它,用户毋庸感知底层简单的设计,外围是答复用户最奢侈的原始诉求。零碎层面的设计要灵便,多用组合正交设计晋升零碎的复用性和扩展性,在具体方案设计中要思考到稳定性因素,比方写日志会带来性能问题,这个在方案设计中就要思考到。洞察到关键技术问题,并非久而久之就能练就成,须要在工作中大量地实际,总结经验,放弃技术的敏感度才行,在第二节中通过理论的案例不便大家加深了解。 1.2 工具有了办法,接下来要有工具来帮咱们更好地做事,与办法对应的,咱们软件设计的工具是UML,接下来介绍UML中罕用的图。 1.2.1 流动图软件从实质上是在模仿事实业务运行的过程,是由一个个交互流动组成的,因而,在分析阶段须要梳理出业务的流动是怎么的,通过图形的形式记录下来。 流动图要体现出「参与者」、「流动终点」、「流动要害门路」、「流动起点」,比方用户下单,有「浏览」、「加购」、「领取」等流动。通过流动图能够看出业务的生命周期是怎么的,可能抓住业务的要害流程。 1.2.2 用例图用例图是强调用户的指标和观点,是文本化的情节形容,用例从实质上讲并不是图,它是文本,用图形是简化了表达形式,它外围有三点:「参与者」、「要做什么」、「后果是怎么的」。用例图是对流动图的细化,对其中的一个流动定义出要实现怎么的指标。场景又是对用例图的细化,你会发现,从指标到实现,一步一步地细化下来,细化是对扩充对意识的了解,不在意识范畴内,也就不会去做。 1.2.3 程序图将场景通过程序图表达出来,它外围强调的是零碎应该提供怎么的能力,留神程序图与时序图的区别,程序图是人与零碎的交互,它想表白的是零碎应该提供怎么的能力满足用户的诉求,而时序图零碎外部实现,强调的是如何实现这种能力。 其实到程序图这一步,基本上零碎要提供的能力就分明了,当然,这里是晓得零碎要做什么,至于要怎么实现它并不关怀。以上我认为它是分析阶段,把用户想实现的内容分明地定义进去,接下来就是思考怎么实现。 1.2.4 时序图时序图有两种作用:一是表白性能是如何实现的;另一个是看责任调配是否正当。第一点比拟好了解,一个性能实现是由多个不同的对象组合来实现,对象间有交互依赖。第二点是评判对象设计是否正当,如何两个对象频繁交互,是不是能够合并在一起,如何一对象中的操作过多,是不是能够拆解。 1.2.5 类图类图的作用也有两种:一是表白属性和职责;另一个是层次结构。类中的属性和职责是一个统一体,属性体现的是认知能力,职责体现的是行为能力,领有怎么的意识,就会产生怎么的行为。类不是一个孤零零的个体,它与其它的类之间有依赖、协作关系,因而,类图中体现继承、依赖、泛化、蕴含等关系。 1.3 准则篇软件设计准则车载斗量,简化下来就三点:「复用」、「变动」、「认知复杂度」,好的设计处处体现设计准则,把这些准则刻画到骨子里,而不是刻意体现,如同「没有规矩不成方圆」一样,重点是要了解为什么要这些准则,从实质上讲是为了软件可能「多快好省」地实现。 利润 = 支出 - 老本,从这个公式中,很显著咱们想要实现利润最大化,怎么办呢,有两个办法:一是支出变多,最好地形式是实现规模化;二是老本升高,不须要或者很少投入老本。从这两点中,引申出「复用」和「变动」两个准则,复用是不投入或者少投入实现性能,相比从头做是不是要节省成本呢,咱们的产品不可能变化无穷的,那么变动是在劫难逃的,如果能撑持灵便地扩大是不是也能节省成本呢。 1.3.1 复用从下面的剖析看,「复用性」的重要水平显而易见,比起烟囱式开发,复用的老本要低得多,所以产生出了xx平台、xx中台,它们的实质目标还是为了复用,缩小反复开发成本。实现复用的伎俩有很多,复用的水平也不一样,这个就要靠平时的积攒,就像医生积攒「药」和「药方」一样,这些都是咱们解决问题的「工具」。先要有复用的思维,否则只有工具也是无用的,不晓得要怎么用、在哪里用。 不同的场景,复用采纳的设计办法是不一样的,举几个例子不便大家了解。 齐全复用最简略的复用是100%的复用,比方加法计算操作,它必定是100%复用的,只用传输不同的数字进去,就能够计算出后果。个别齐全复用的是工具型的能力,它与具体的业务语义无关。 配置化复用这一类的复用水平靠近100%,只用配置一些与业务相干的具体的参数即可,比方对账场景,配置两个不同的数据源表,再配置对账规定即可实现对账。这一类场景实用于业务比拟固定,流程是通用的,并且差别变动是可枚举的。 局部复用然而,在实现世界中,没有太多像齐全复用的事件,如果变动还不能通过配置化来实现,能够应用「模板办法」或「策略模式」,将变动提早到子类中去实现,这种办法在大家日常工作很常见,也有的应用SPI扩大点实现。这一类复用场景是有明确的「主流程」,只有大量的变动随业务变动,变动也是可枚举的,那么就能够形象出扩大点。 还有一类变动是很难枚举的,不晓得会有怎么的变动,此时最好的办法是通过「事件」解耦,主流程实现之后,发一个事件音讯进去,谁关注就去实现该性能,实质上讲Spring中Aware机制也属于事件的解决办法。 齐全不能复用还有一类齐全不能复用,但要形象出规范的接口,比方罕用的数据库操作,Connection、Statement就是规范的接口,不同的数据库厂商实现具体的数据库操作。不要感觉这种没有意义,它从更高的层面定义了标准,使用者是面向形象应用,能够不关注具体的实现是怎么的。 1.3.2 变动复用和变动是一起进去的,软件惟一不变的是变动,怎么撑持将来更好地扩大是咱们要思考的,如果一个性能千年不变,怎么简略就怎么实现,而如果有变动的话,那就须要好好地设计,用起码的老本去撑持将来的变动。比拟难的是要洞察出什么在变动,这个还真不是那么好想到的,须要有行业教训积攒,看多了、实际多了,会发现外面的一些门道。 举一个应答变动的例子,税务在计税时,不同的业务计税规定不一样,有的金本位要计税,有的不须要计税,有的非金本位要计税,有的不须要。如果放在一个大的扩大点中实现,那么这就是典型的面向过程的设计思维,咱们形象出了「计税表达式」这个实体来应答变动,「计税项」要不要计税、计税口径是怎么的,新业务接入通过「配置化」来解决。 1.3.3 意识复杂度意识是分档次的,最高层越简略,最低层越简单,对于使用者来讲,他心愿看到的是简略的内容,如果太简单,很难上手,比方命令行式的操作系统和桌面式的操作系统,显著桌面式的操作系统更受公众的欢送,这也是微软在目前仍然在操作系统市场占用份额上还是大头的起因。软件分层的目标不仅是让关注点拆散,还有另外一个目标是升高意识复杂度,从简略到简单,这和咱们软件剖析一样的,从粗到细。 类的设计也是一样的,举一个例子,税务在开发票时,开票这个模型构造须要调用者感知吗,必定不须要,因为发票中有很多的畛域概念,如开票主体、发票行等,用户的目标就是开一张发票,他只用通知你他晓得的信息,不关怀你外部要怎么实现,基于这个思考,咱们形象出了「开票申请」这个实体进去,它实质是贴近业务场景的实体,所蕴含的信息也是无限的,极大地升高了认知复杂度。 二、系统分析与设计的2个案例2.1 日志框架2.1.1 日志框架剖析打印日志在咱们日常工作简直是人人都会接触到,日志的核心作用是记录要害无效的信息,帮忙咱们疾速地排查、定位问题,否则没有日志信息两眼一抓瞎。依据咱们的教训,心愿日志中蕴含工夫、类、办法、代码行、要害日志信息,用了这些信息就能不便咱们排查问题。 依据下面的剖析,咱们很快能够画出日志的概念模型,如下图所示。从实质上讲,咱们是将日志信息存储到指定的中央,如存储文件中,输入到管制台上,另外还有日志存储的格局能够有多种,比方一般的格局,还有XML、HTML的格局等。 从概念模型上看,设计一个日志框架并不简单,但在设计阶段中,还须要开掘更多的信息,咱们输出的信息更多,设计时思考的因素也就越全,更能满足用户的诉求。 2.1.1 日志框架设计2.1.1.1 贴近用户的设计 站在用户的视角,他关注的是信息以怎么的格局存储在哪里,因而,有两个概念用户是要关注的,一个是「存储目的地」,另一个是「存储款式」,这两个是能够依据用户的爱好配置的,将这两个概念形象下,「存储目的地」形象成「Appender」,「存储款式」形象成「LayoutPattern」。除了配置外,用户在应用时须要一个接口类,将其形象成「Logger」门面类,只用简略的调用日志打印接口即可。 2.1.1.1 零碎视角的设计 站在零碎视角上,用户在日志打印时,他关注的是日志信息,如工夫、类名、办法名等信息他不会显示去写,因而还须要形象一个概念进去表白日志信息的概念,形象成「LogRecord」,这样概念类图如下图所示。 依照这个设计,很快能够设计出一个繁难的日志框架,代码构造如下所示。 Appender类如下所示,它定义的是一个模板办法,先调用LayoutPattern获取格式化的日志数据,而后再输入到指标存储上,Appender和LayoutPattern是能够独立变动的,同时将写操作提早到子类中实现。 再细细想一下,日志自身是为了不便排查问题,但额定日志的存储是有性能开销的,这个在设计时就要着重思考了。如何缩小写日志带来的性能开销呢,从三个方面思考: 大文件变小文件:关上一个1G的文件和关上1M的文件必定是不一样的,简单问题的治理也是同样的思路,拆分成小问题解决,因而在写文件时能够依照「工夫」、「容量大小」切分成小的文件。内存映射写文件:传统的IO写数据,操作系统须要从用户态切换到内核态,性能开销会很大,能够应用内存映射的形式写文件,晋升IO性能。同步变异步写文件:同步写文件是须要等文件写好了后再往下执行业务代码,而异步就不一样,它将日志记录存储在一个队列中,开户另一个线程缓缓写到文件中,不阻塞业务逻辑执行。通过下面的剖析,一个简略的日志框架随着对它的了解加深,设计方案也在变动,外围是要能看到要害的技术问题有哪些,能提供哪些增量价值或差异化的价值。 ...

September 12, 2023 · 1 min · jiezi

关于软件设计:聊聊前端-UI-组件组件体系

本文是文章系列「聊聊前端 UI 组件」的第三篇。 在本系列的上篇文章《聊聊前端 UI 组件:组件特色》中,通过从关注点拆散的角度进行前端 UI 组件的形成剖析,并以较为形象的视角对 UI 组件分门别类,以及形容了让组件间能够体现复用的继承关系,从而建设出前端 UI 组件的特色模型。 本文将以上篇文章中所得出的特色模型为根底,探讨下如何设计并建设一个前端 UI 组件体系。 在做组件体系设计的时候,最重要的一点就是——要真真正正地想着把 UI 组件弄成可复用的,就像制造业生产时所用的物料一样——结构可替换的 UI 组件。 因为 UI 组件形成元素的易变性对组件体系的设计有着很大的影响,为了不便查看,将上篇文章中的易变性及其影响因素的表格搬过去: 形成 易变性影响因素构造视觉构造不易变内容构造、布局类款式 内容构造较易变生成 HTML 的 JS 库/框架的源码、平台限定的视图构造描述语言体现主题格调很易变GUI 设计人员的审美和想法、非布局类款式、图标与图片行为交互逻辑不易变交互设计人员的想法 业务逻辑很易变业务规定组件架构表格中列出的 UI 组件形成元素都能够作为独自的组件存在。如果把 UI 组件看作是「最终产品」的话,那么 UI 组件形成元素所对应的那些组件就是「两头产品」。 在软件工程中,「组件(component)」个别是指软件的可复用块,好比制造业所应用的「构件」。这是一个比拟宽泛的概念,它能够是软件包,能够是 web 服务,也能够是模块等。 但在前端眼里,「组件」通常是指页面上的视图单元,即「UI 组件」。能够说,「UI 组件」是「组件」的子集。 欧雷《聊聊前端 UI 组件:外围概念》 鉴于上述起因,这里须要特地阐明下:上文所说的「作为独自的组件存在」中的「组件」是指「软件的可复用块」,而不是「UI 组件」。 格调组件在上篇文章中提到了「虚构组件」的概念—— 在持续往下之前,先引入一个「虚构组件」的概念。正如它的名字所示,是一个虚构的,理论不存在的,只是概念上的组件。它是几个主题格调属性的汇合。 欧雷《聊聊前端 UI 组件:组件特色》 与之类似,「格调组件」也是一些主题格调属性的汇合,大略包含: 如果要用代码来体现的话,能够借助 CSS 预处理器中的变量。这里用 Sass 来举例: // 主题色$sc--primary: #cce5ff !default;$sc--secondary: #e2e3e5 !default;$sc--info: #d1ecf1 !default;$sc--success: #d4edda !default;$sc--warning: #fff3cd !default;$sc--danger: #f8d7da !default;// 文本色$sc--text-primary: #303133 !default;$sc--text-secondary: #696c71 !default;$sc--text-heading: #2c405a !default;$sc--text-regular: #333 !default;$sc--text-placeholder: #c0c4cc !default;// 字体尺寸$sc--font-size: 14px !default;$sc--font-size-lg: 16px !default;$sc--font-size-sm: 12px !default;// 字体粗细$sc--font-weight-light: 300 !default;$sc--font-weight-normal: 400 !default;$sc--font-weight-bold: 700 !default;// 边框粗细$sc--border-width: 1px !default;// 边框色彩$sc--border-color: #dcdfe6 !default;// 边框圆角$sc--border-radius: 4px !default;$sc--border-radius-lg: 6px !default;$sc--border-radius-sm: 2px !default;格调组件与体现复用的继承密切相关—— ...

September 12, 2023 · 3 min · jiezi

关于软件设计:聊聊前端-UI-组件组件特征

本文是文章系列「聊聊前端 UI 组件」的第二篇,内容与本系列的上篇文章《聊聊前端 UI 组件:外围概念》有所关联,如果还没看过,倡议去看下。 本文的次要内容是依据特色对前端 UI 组件进行建模,让咱们尽可能充沛地理解它的方方面面,并为如何设计以及建设一个组件体系打下基础。 组件形成从关注点拆散的角度合成 UI 组件,并剖析其各局部的易变性。 形成元素一个残缺的具备性能的 UI 组件的形成,有构造(structure)、体现(presentation)和行为(behavior)这三个方面。为什么强调是「残缺的具备性能的 UI 组件」?是因为它是一个最全的特色汇合,而其余的「UI 组件」可能会短少一些特色,从而使剖析不那么欠缺。 看到「构造」、「体现」与「行为」这三个词,作为一名有教训的前端开发者,很天然地就会想到很久很久之前开始始终提倡的前端开发的关注点拆散——HTML 负责组织页面构造,CSS 负责网页内容的体现款式,JS 则负责用户与网页之间的交互,它们各自扮演着不同且相辅相成的角色。 然而在这里,它们的含意会有所不同—— 经 HTML 组织后的网页内容是「构造」没错,但它仅仅是代码层面的,未被 CSS 所影响的构造。最终的视觉出现,也就是视觉层面的「构造」,应该还包含 CSS 的布局类款式,如定位(positioning)、浮动(float)等。 CSS 中的那些非布局类款式,如色彩、字体、文本、边框、尺寸、留白等类别的款式,以及图标、图片,皆为「体现」。这些个别还被称为「主题格调」或者「皮肤」。 可在 JS 中运行的事件零碎以及进行逻辑解决的函数和对象办法,算是「行为」——这就是 UI 组件的交互逻辑了。当然了,与交互逻辑相交融的业务逻辑,也是「行为」的一部分。 易变性依据形成 UI 组件的每个局部的性质,会影响 UI 组件相应局部的易变性——对于组件复用来说,该局部是绝对稳固的还是绝对不稳固。 GUI 倒退了几十年,人机交互的图形元素及布局形式曾经绝对固定,只有不是呈现像 Google Glass 之类的革命性交互设施,就不会产生重大扭转。 欧雷《我来聊聊面向模板的前端开发》 如上所述,将来到底会呈现什么样的变革性交互方式无从得悉,但我认为,只有是须要用眼去看且用手去操作,交互方式就逃不离这几十年来未有啥改革的模式。因而,UI 组件的视觉构造和交互逻辑是最不易变的,且无论是交互模式还是触发事件都是可枚举的。 如果单纯从最终的 HTML 构造上来看,它也算是不易变的,但在古代前端开发中,HTML 的构造根本是动静生成的,并且强依赖于 React、Vue 这类没有统一标准的 JS 库/框架。另外,还存在着像 WXML、AXML 这类平台限定的视图构造描述语言。因为写法不统一,这就使页面内容构造变得不那么稳固。 一般来说,离用户越近的货色越容易产生扭转。在网站、利用中离用户最近的是 GUI,而在 GUI 中离用户最近的则是主题格调,这是对用户来说最直观的货色。主题格调会随着 GUI 设计人员(通常是设计师)的审美和想法而扭转,所以它是最易变的。 因为业务逻辑是进行业务相干解决的外围所在,如果业务规定变了,相应的代码实现也得跟着扭转,所以业务逻辑也是很易变的。业务逻辑对于一个网站、利用来说是十分必要且重要的,但对 UI 组件来说,它就没那么必要了,更谈不上重要。在前端的 GUI 层面,业务逻辑理当是交互逻辑的延长。 ...

September 11, 2023 · 1 min · jiezi

关于软件设计:聊聊前端-UI-组件核心概念

本文是一个文章系列的第一篇,次要阐明几个基本概念以及所要探讨的指标主体,目标是对立认知上的「上下文」以尽量避免因信息不对称而造成了解阻碍。 这一系列文章是对于前端 UI 组件的,我想通过这个系列静下心来好好聊聊与之相干的内容。 每个名词都是概念,就像一个「数据包」,依据其被「压缩」的信息量,要真正地了解一个词语可能须要大量的常识储备。 基本概念咱们要聊的是「前端 UI 组件」,这个词能够进一步拆分成「前端」、「UI」和「组件」这三个词。所以,要想弄明确「前端 UI 组件」是什么,得先把组成它的三个词搞懂。 UI?GUI?平时在议论一个软件的视觉方面的问题时,总会用到「UI」这个英文缩写,有时也会说「GUI」。尽管它们是不同的含意,但在大多数状况下,咱们是将这两个词划等号了。在这里,我试图帮大家将这两个词辨别开,就算用法仍然不变,至多可能意识到它们的区别。 人与机器间,更确切地说是与人造零碎间,是如何进行互动的以及如何更好地交互,是人们始终在摸索的——也就是「人机交互」这个词所代表的。「人造零碎」能够是各种各样的物理机器,也能够是计算机系统和软件。 「交互」的实质就是人/物体间的信息替换,即信息从一个人/物体输入,输出到另一个人/物体中。因而,两个人/物体、输入形式、输出形式是交互的几个基本要素。 在人机交互的场景中,进行互动的对象是人和人造零碎。人通过敲击、触摸、谈话等形式输入信息,通过视觉、听觉、触觉等形式输出信息;人造零碎则通过文本、图形、声音等形式输入信息,通过将人以各种形式产生的信息转化为电流的形式输出信息。 在人机交互中起到信息替换作用的那块空间,叫做「人机交互界面」,也叫「用户界面」。「UI」就是「用户界面」所对应的英文单词「User Interface」的缩写。 不同的交互方式和档次产生了不同的「用户界面」,如:基于文本的「命令行界面(Command-line Interface)」、基于图形的「图形用户界面(Graphical User Interface)」、基于语音的「自然语言用户界面(Natural-language User Interface)」等等。 其中,「图形用户界面」是目前比拟宽泛应用的,它的英文缩写就是「GUI」。 前端开发所谓的「前端开发」就是利用 web 前端技术进行 GUI 相干的开发工作,专门从事这类工作的人被称为「前端开发者」。 在以前,「前端开发者」是指「页面重构工程师」和「前端开发工程师」;随着业务和技术的倒退,「页面重构工程师」慢慢退出历史舞台,「前端开发者」根本与「前端开发工程师」划等号,并且称说变得更精简——「前端工程师」。 在职业产生扭转的同时,作为一个「前端开发者」,作为一名「前端工程师」,企业和业界的冀望变高了,所承当的职责变重了——这是一次职业降级,也是一次行业荡涤——适应的人变更强了,不适的人被淘汰了。 时至今日,「前端开发」的含意也不是当初单纯地写写页面做做网站,还涵盖了前端工程相干的 CLI 工具、挪动端和桌面端的客户端利用、服务端中比拟凑近前端的局部等等等等——这俨然是一个「客户端工程师」所做的工作——没错!「前端开发」实质上就是「客户端开发」的一个分支,只不过这点越来越被强化了,并且「客户端开发」越来越趋势对立,能够称之为「泛客户端开发」。 无论工作内容和职业职责怎么变,只有是做这行,所要解决的外围问题是不变的——人与人造零碎之间如何更好地进行互动。 组件?控件?在软件工程中,「组件(component)」个别是指软件的可复用块,好比制造业所应用的「构件」。这是一个比拟宽泛的概念,它能够是软件包,能够是 web 服务,也能够是模块等。 但在前端眼里,「组件」通常是指页面上的视图单元,即「UI 组件」。能够说,「UI 组件」是「组件」的子集。你可能还总会听到「控件(control)」这个词。放轻松,别抓头,它只是「UI 组件」的一个别名而已。 一般的组件通用性很差,也就是说,它根本只能用于某个特定的零碎且不能被替换。有一种组件,它是基于标准化的接口标准开发进去的,能用在任何对接了该接口的零碎,也能被任何合乎该接口标准的组件替换——它就是「可替换组件」,就像制造业所应用的「标准件」。 可替换的 UI 组件是前端 GUI 开发从手工作坊到主动拆卸的关键所在。 相干概念下面通过三个比拟根本的概念论述了「前端 UI 组件」是什么,上面再来说说会对其产生重大影响的几个概念—— 设计体系所谓的「设计体系」,即「Design System」,是与 UI 组件非亲非故的一个概念。能够认为,设计体系是 UI 组件的外观及交互的理论依据,而 UI 组件是设计体系的具体实现。 设计体系的存在是为了辅助像网站、利用等数字产品的设计与开发,它作为惟一的参考而让不同团队的人(如产品经理、设计师和开发人员等)能够一起参加到数字产品的建设当中。 基于设计体系设计并开发进去的产品无论是在观感上还是体验上都可能放弃肯定的一致性,建立产品形象并流传品牌价值。 设计体系所涵盖的内容,包含但不限于设计语言、格调指南、模式库、UI 组件、品牌语言及与之相干的应用阐明文档——设计体系自身不是一个交付物,但它是由一些交付物组成的,并会随着产品、工具和技术等的更新而一直进化。 从下面所列出的设计体系的涵盖内容中能够看出,形成它的元素有无形的,像模式、UI 组件、指南及给设计师和开发人员所应用的工具等;还有一些是有形的,像品牌价值观、合作形式、思维形式和独特信念等。 格调指南和模式库是比拟重要的两个交付物:格调指南着眼于一些图形款式及其用法,如色彩、字体、图片等;模式库则集成了具备性能的 UI 组件及其用法。 ...

September 10, 2023 · 1 min · jiezi

关于软件设计:架构师日记深入理解软件设计模式-京东云技术团队

作者:京东批发 刘慧卿 一 设计模式与编程语言1.1 什么是设计模式设计模式(Design pattern) :由软件开发人员在软件开发中面临常见问题的解决方案,是通过长时间的试验积攒总结进去的,它使设计更加灵便和优雅,复用性更好。从实用的角度来看,它代表了某一类问题的最佳实际。 设计模式到底解决了开发过程中的哪些难题呢,它又是如何来解决的呢? 其外围是:复用和解耦。使不稳固依赖于稳固、具体依赖于形象,以此加强软件设计适应变动的能力。 1.2 什么是编程范式要探讨设计模式和编程语言的关系,还得从编程范式谈起。编程范式一词最早来自 Robert Floyd 在 1979 年图灵奖的颁奖演说,是程序员对待程序的观点,代表了程序设计者认为程序应该如何被构建和执行的认识,与软件建模形式和架构格调有严密关系。 以后支流的编程范式有三种: 1.结构化编程(structured programming) 2.面向对象编程(object-oriented programming) 3.函数式编程(functional programming) 这几种编程范式之间的关系如下: 1.起初是非结构化编程,指令(goto指令)能够轻易跳转,数据能够轻易援用。起初有了结构化编程,人们把 goto 语句去掉了,束缚了指令的方向性,过程之间是单向的,但数据却是能够全局拜访的; 2.起初面向对象编程的时候,人们罗唆将数据与其严密耦合的办法放在一个逻辑边界内,束缚了数据的作用域,靠关系来查找; 3.到函数式编程的时候,人们束缚了数据的可变性,通过一系列函数的组合来形容数据,从源到指标映射规定的编排,两头它是无状态的; 编程范式是形象的,编程语言是具体的。编程范式是编程语言背地的思维,要通过编程语言来体现。C 语言的支流编程范式是结构化编程,而 Java 语言的支流编程范式是面向对象编程,起初 Java8 开始反对 Lambda 表达式,将函数式编程范式的内容交融进来,同时新诞生的语言一开始就反对多范式,比方 Scala,Go 和 Rust 等。 从结构化编程到面向对象编程,再到函数式编程,形象水平越来越高(离图灵机模型越来越远),与畛域问题的间隔越来越近。直观的来讲,就是解决事实问题的效率晋升了,灵活性和执行效率随之有所降落。 设计模式无论用什么语言实现都是能够的,然而因为语言的各自差异化特点,不是每种语言都完满或对立实现各种设计模式。比方Java外面有策略模式,那是因为Java8之前不反对办法传递,不能把一个办法当作参数传给他人,所以有了策略模式。而JavaScript等语言能够间接传函数,就基本没必要造一个策略模式进去。 1.3 什么是多态个性面向对象编程语言有三大个性:封装、继承和多态。 1.封装即信息暗藏或数据保护,“数据结构"通过裸露无限的拜访接口,受权内部仅能通过"数据结构"提供的办法(函数)来拜访其外部的数据; 2.继承的益处是能够实现代码复用,但不应适度应用,如果继承的档次过深就会导致代码可读性和可维护性变差。 因而倡议少用继承而多用组合模式; 3.多态能够分为变量的多态,办法的多态,类的多态。通常强调的是类的多态,多态的实现是指子类能够替换父类,在理论代码运行过程中调用子类的办法实现; 多态能够说是面向对象中最重要的一个个性,是解决我的项目中紧偶合的问题,进步代码的可扩展性和可复用性的外围,是很多设计模式、设计准则、编程技巧的代码实现根底。 多态比拟直观的了解就是去实现某个动作,当不同的对象去实现时会产生出不同的状态,其作用范畴能够是办法的参数和办法的返回类型。 多态这种个性也须要编程语言提供非凡的语法机制来实现,Java 中多态能够通过"子类继承父类+子类重写父类办法+父类援用指向子类对象"的形式实现,还能够通过"接口语法"的形式实现。C++中则应用virtual(虚函数)关键字来实现。 像一些动静语言如 Python 也能够通过 duck-typing 的语法实现,另外 Go 语言中的"隐藏式接口"也算是 duck-typing。 Python 语言,实现多态示例如下: class MyFile: def write(self): print('I write a message into file.') class MyDB: def write(self): print('I write data into db. ') def doIt(writer): writer.write()def demo(): myFile= MyFile() myDB = MyDB() doIt(myFile) doIt(myDB )二 设计模式与架构模式2.1 理解架构模式对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案,能够为设计大型软件系统的各个方面提供相应的领导。它不仅显示了软件需要和软件结构之间的对应关系,而且指定了整个软件系统的组织和拓扑构造,提供了一些设计决策的基本原理,常见的架构设计模式如下: ...

May 5, 2023 · 6 min · jiezi

关于软件设计:为什么说过早优化是万恶之源

 Donald Knuth(高德纳)是一位计算机科学界的驰名学者和计算机程序设计的先驱之一。他被誉为计算机科学的“圣经”《计算机程序设计艺术》的作者,提出了驰名的“大O符号”来形容算法的工夫复杂度和空间复杂度,开发了TeX零碎用于排版科技文献,取得过图灵奖、冯·诺伊曼奖、美国国家迷信奖章等多项荣誉。明天要说的就是他所提出的一条软件设计重要准则 Premature optimization is the root of all evil 过早优化是万恶之源。 为什么说“过早优化是万恶之源”? 我认为过早优化代码会让人陷入到谬误的指标中去,从而漠视掉了最重要的指标。举个很简略的例子,你须要疾速构建一个产品来抢占用户,你当下最重要的指标是让这个产品疾速上线,而不是把这个产品打造的好用(在中国互联网下,这样的事不可胜数),如果你只关注到后者体验、性能问题而漠视了速度,在当下高度竞争的市场之下,你基本毫无机会。 当然下面这个例子是从理性的层面说的,对很多程序猿来说也可能波及不到产品层面的内容。咱们从软件设计的层面,感性的来说,过早优化可能会导致以下的一些问题: 减少代码的复杂性:适度优化可能会导致代码的复杂性减少,从而升高代码的可读性和可维护性。如果代码过于简单,可能会导致开发人员难以了解和保护代码,从而减少开发成本和工夫。消耗开发工夫和资源:适度优化可能会导致开发人员破费大量工夫和资源在代码的性能优化上,而疏忽了其余重要的开发工作。这可能会导致我的项目进度延误和开发成本减少。升高代码的可移植性:适度优化可能会导致代码的可移植性升高。如果代码过于依赖于特定的硬件或操作系统,可能会导致代码无奈在其余环境中运行。升高代码的可扩展性:适度优化可能会升高代码的可扩展性。如果代码过于依赖于特定的算法或数据结构,可能会导致代码无奈适应将来的需要变动。过早优化的典型案例 在软件工程史上因为适度关注软件性能导致我的项目最终失败的案例亘古未有,比方我上面要说的一些我的项目,在软件工程史上都是十分出名的我的项目(当然可能有些新生代程序员曾经不晓得了)。 IBM OS/360操作系统:在20世纪60年代,IBM公司开发了OS/360操作系统,这是过后最大的软件工程我的项目之一。在开发过程中,IBM公司过于关注代码的性能问题,导致代码的复杂性减少,开发工夫延误,最终导致我的项目的失败。我通晓这个我的项目还是在我最近在浏览的一本软件工程经典书籍《人月神话》中,也举荐大家浏览下,这个我的项目尽管最终失败了,但也给整个软件工程畛域留下了贵重的教训。Netscape Navigator浏览器:在20世纪90年代,Netscape公司开发了Navigator浏览器,这是过后最风行的浏览器之一。在开发过程中,Netscape公司过于关注代码的性能问题,导致代码的复杂性减少,开发工夫延误,最终导致浏览器市场份额重大降落。Windows Vista操作系统:在21世纪初,微软公司开发了Windows Vista操作系统,这是过后最大的软件工程我的项目之一。在开发过程中,微软公司过于关注代码的性能问题,导致代码的复杂性减少,开发工夫延误,最终导致操作系统的用户体验不佳,市场反应不佳。话说这个操作系统我还用过呢,用户界面还是很漂亮的,很多UI设计也被沿用到了Window7中。如何辨认过早优化 在软件开发过程中,如何判断是否过早优化呢?这里有一些概括性的判断规范,能够简略参考下: 是否存在性能问题:如果代码还没有性能问题,那么过早优化就是不必要的。因而,在进行优化之前,应该先测试代码的性能,确定是否存在性能问题。是否优化了将来可能产生的问题:如果优化的是将来可能产生的问题,而不是以后存在的问题,那么就可能是过早优化。在进行优化之前,应该优先思考以后存在的问题,而不是将来可能产生的问题。是否就义了代码的可读性和可维护性:如果优化代码会导致代码的复杂性减少,升高代码的可读性和可维护性,那么就可能是过早优化。在进行优化之前,应该优先思考代码的可读性、可维护性和可扩展性。是否节约了大量的开发工夫和资源:如果优化代码会节约大量的开发工夫和资源,而不是进步代码的性能和效率,那么就可能是过早优化。在进行优化之前,应该评估优化的老本和收益,确定是否值得进行优化。 判断是否过早优化须要依据具体情况进行评估。在进行优化之前,应该先测试代码的性能,确定是否存在性能问题。同时,也应该优先思考代码的可读性、可维护性和可扩展性,防止适度优化。 总结 作为一名在IT畛域摸爬滚打多年的工程师,我深有体会地意识到过早优化是软件开发中的一大陷阱。在软件开发的初期,咱们可能会过于关注代码的性能问题,而疏忽了代码的可读性、可维护性和可扩展性。这种做法可能会导致代码的复杂性减少,升高代码的可读性和可维护性,甚至可能会节约大量的开发工夫和资源。 在软件开发过程中,咱们应该防止过早优化,而是优先思考代码的可读性、可维护性和可扩展性。当须要进行性能优化时,应该在代码的根底上进行优化,通过剖析性能瓶颈、优化算法和数据结构等办法来进步代码的性能和效率。同时,咱们也应该意识到,性能优化并不是软件开发的惟一指标,咱们还应该重视代码的可读性、可维护性和可扩展性,以便保障代码的品质和可靠性。

April 2, 2023 · 1 min · jiezi

关于软件设计:DatenLord前沿技术分享-No15

1、 演讲题目应用 TLA+ 为分布式算法验证正确性 2、演讲工夫2023年1月8日上午10:30 3、演讲人原野 达坦科技(DatenLord) 4、引言随着计算机领域的倒退,软件变得越来越宏大简单。特地是在并发与分布式畛域,因为其具备极高的复杂性,传统的基于“教训”的软件设计与验证形式曾经不能满足需要,因而咱们须要一种更好的形式验证软件的正确性——应用 TLA+。 5、内容简介本次分享中,会介绍形式化标准语言 TLA+ 的个性与思维,并从与传统编程不同的角度,利用简略的数学知识,为一些简略的算法编写 TLA+ specification。 6、直播预约欢迎您预约直播,或者登陆腾讯会议观看直播: 会议号:581-8301-3525

January 6, 2023 · 1 min · jiezi