IT技术博客大学习 共学习 共进步

标签:设计模式

共 34 篇相关文章

IT 累计浏览 4,825

自己写的一个轻量级javascript框架的设计模式

这篇讲的是作者从实际项目需求出发,动手构建一个轻量级JavaScript框架的过程。因为觉得现有框架如jQuery对小项目来说过于庞大,作者决定利用周末时间,探索如何用更精简的代码实现核心功能。文章重点探讨了JavaScript中不同于PHP的类继承机制,梳理了构建函数、原型扩展以及综合方式等多种实现方法,并参考了jQuery作者的类继承函数作为借鉴。作者分享了自己在设计这个迷你框架时的思考路径和技术选型,为希望理解框架底层原理或有类似定制化需求的开发者提供了切实的实践参考。

IT 累计浏览 3,501

Lua GC 的源码剖析 (3)

这篇讲的是Lua垃圾回收(GC)机制的深入实现剖析,作为系列第三篇,它在已有知识基础上,开始带领读者从整体架构自顶向下阅读GC模块的核心源码。 作者没有停留在概念层面,而是直接切入代码,展示了GC如何通过“增量回收”策略来控制每次回收的停顿时间。文章重点分析了“三色标记法”的具体实现,详细解释了白色、灰色、黑色对象状态如何在代码中流转,以及屏障机制如何保证并发标记的一致性。特别值得注意的是,文中对“弱表”在GC过程中的特殊处理进行了细致的代码级解读,揭示了这一常用特性的底层奥秘。 通过这种逐行深入的方式,文章将复杂的回收算法具象化为清晰的代码逻辑,对于想要理解GC如何在实际中权衡性能与效率、或是有志于优化脚本引擎的开发者来说,能提供非常扎实的底层认知。

IT 累计浏览 2,680

那些炒作过度的技术和概念

这篇讲的是技术圈里那些曾被炒得沸沸扬扬、如今看来却未必名副其实的概念。作者从 StackExchange 上一篇热议帖出发,从近20年“最被过度炒作的软件工程技术”榜单里,精心挑选了10个例子进行讨论。 有意思的是,作者特意排除了广受认可的 Java “一次编写,到处运行”理念和 TDD(测试驱动开发)。他认为这两项技术实质上是成功的,炒作并未超出其真实价值。这种筛选本身,就体现了一种清醒的判断:炒作的泡沫之下,有些技术依然坚实,有些则可能被过度包装。 文章并非简单罗列技术名词,而是通过作者的个人评注和社区讨论,勾勒出技术热潮中的集体记忆与反思。它提醒我们,在追逐新技术浪潮时,不妨多一分审视:哪些是真正解决了痛点的核心创新,哪些又只是被舆论放大的光环?对于开发者而言,这种辨识力或许比盲目跟进更重要。

IT 累计浏览 1,900

前端要给力之:代码可以有多烂?

这篇讲的是从一次真实的团队讨论切入,聊了一个每个程序员都关心但又容易回避的话题:代码到底能有多烂。 作者从淘宝前端项目KissyUI的一个技术群聊说起,有同事在看完他内部的“读烂代码系列”分享后,直接抛出了一个灵魂拷问:“烂代码是怎么定义的?” 文章没有急于下定论,而是从这个自然对话场景展开,将讨论延伸到“烂”背后的具体形态。它不满足于列举“变量命名混乱”、“函数过长”这类表面症状,而是深入到了代码的“内在腐坏”:比如看似无害但牵一发而动全身的耦合、为求短期方便而埋下的设计妥协、以及那些让维护者感到困惑和沮丧的“隐性知识”。 作者的核心观点在于,定义“烂代码”的关键不在于违反了多少条编码规范,而在于它是否增加了系统的“认知成本”和“维护恐惧”。一篇代码如果让后来的开发者不敢改、不想改、或者每次修改都如履薄冰,那么它就是实质上的烂代码。文章最后将问题抛回给读者,启发我们去审视自己经手的代码:它是在为未来铺路,还是在不断堆积技术债务?

IT 累计浏览 2,481

信息闭环设计小谈

这篇讲的是信息架构设计中常被忽视的一环——如何应对用户的“认知局限”。作者从卡片分类法这类常见的理性推演方式切入,指出了一个实际痛点:用户往往无法在第一时间掌握信息的全部分类体系。与其强求用户学习复杂的顶层设计,不如通过巧妙的交互设计,为用户提供一条渐进式的学习路径,这便是文章探讨的“信息闭环设计”。它强调通过设计闭环反馈,让用户在与产品的交互中,自然而然地完成对信息结构的理解与构建,从而化解信息架构的复杂性。

IT 累计浏览 2,761

手机产品的信息架构

这篇讲的是我们每天面对的手机界面背后,那个“看不见的建筑师”——信息架构。作者从一个核心问题出发:当手机功能越来越多,菜单越来越复杂,如何让用户毫不费力地找到想要的功能,而不是在层层嵌套的目录里迷路? 文章指出,信息架构并非简单的页面设计或功能堆砌,而是一场精心的组织战。它探讨如何将庞杂的系统功能,按照用户的心智模型进行分类、层级划分与关联,构建一个清晰、一致且可预测的导航体系。比如,为什么“设置”里的选项要这样排列?支付功能为什么总在特定的位置?其背后都有对用户行为和认知负荷的考量。 最终,一个优秀的手机信息架构能让复杂系统变得简单直观,它定义了用户与产品交互的逻辑路径。好的架构是隐形的,你感觉不到它的存在,却总能顺畅地抵达目的地。

IT 累计浏览 2,745

设计模式-自动完成

这篇讲的是设计模式中的“自动完成”模式。它主要解决的是如何在软件开发中,高效地处理一系列重复或具有内在规律的任务。 作者从实际开发中那些需要“套用固定流程”的场景出发,比如数据处理管道的构建、文档解析的固定步骤,或是游戏中角色状态的管理。自动完成模式的核心思想是,将这些稳定不变的步骤抽象出来,封装成一个可复用的“模板”或“骨架”,而把那些易变的部分留给子类去具体实现。这样一来,新功能的增加或流程的调整,只需扩展特定的部分,而无需改动整体结构。 这种模式特别适合那些流程清晰、步骤固定但具体实现细节可能变化的场景。它和策略模式有点像,但策略更侧重于算法的替换,而自动完成则强调对流程步骤的控制和复用。掌握它,能帮你写出更清晰、更易维护的代码,把变化控制在局部。

IT 累计浏览 3,340

从 if else 到 switch case 再到抽象

这篇讲的是代码中复杂分支的抽象之道。作者从接手遗留代码时常遇到的痛点切入——那些嵌套两层以上的 if-else 或 switch-case 往往让人望而生畏。文章指出,这类复杂分支并非天生,而是在需求迭代中,因开发者追求短期速度或抽象意识不足,不断用标志位和条件判断“打补丁”累积而成。 作者以一段百度Hi老代码为例,揭示了复杂分支的核心问题:一个简单的 else 分支,其实隐含了它前面所有条件取反再相与的复杂逻辑,这使得代码意图变得极其隐晦,难以阅读和维护。 为了解决这一问题,文章提出了两种清晰的抽象路径。一是用面向对象的工厂模式,将不同分支的处理封装到独立的类中,解除嵌套,让每个模块只需关注自身职责。二是采用声明式的模式匹配,用直观的数据结构描述直接匹配目标数据,彻底消除隐含逻辑。后者让每个监听条件都明确、独立,大大提升了代码的可读性。文章最终引导读者思考,如何通过提升抽象层次,让代码在复杂迭代中保持清晰。

IT 累计浏览 2,420

JS 常用继承实现方式

这篇讲的是JavaScript中实现继承的三种经典方式。作者在研读《JavaScript 设计模式》时,将书中提到的从原型链到组合继承等具体实现进行了提炼和记录,目的是帮助开发者解决“记不住、易混淆”的基础痛点。 文章没有泛泛而谈,而是直接切入三种不同继承方式的核心代码与逻辑差异。比如,原型继承如何实现属性复用但可能导致引用值共享问题,构造函数继承怎样解决引用共享却无法复用方法,而组合继承又是如何结合前两者优点成为早期标准方案的。作者通过对比梳理,清晰地呈现了每种方式的适用场景与潜在陷阱。 对于需要夯实JS基础、厘清原型与继承脉络的开发者来说,这篇总结提供了一个清晰、可随时查阅的实践备忘。

IT 累计浏览 2,740

状态模式和策略模式的比较

这篇讲的是经典设计模式中容易被混淆的“双胞胎”——状态模式与策略模式。它们都通过多态将操作分派到一组类中,代码结构几乎一模一样,但作者从意图和应用场景上切入,点明了核心差异:状态模式关注的是对象内部状态的流转与行为切换,而策略模式则聚焦于外部算法或行为的选择与替换。 文章通过具体代码对比指出,虽然两者都依赖接口和实现类,但状态模式的状态对象通常持有上下文引用并能自主触发状态变更,形成一条隐形的“状态链”;策略模式的策略对象则更加独立,由客户端在运行时显式选定并注入,更像可插拔的“算法插件”。这种细微的设计思想差别,决定了前者更适合解决对象生命周期中复杂的内在状态管理问题(如订单流程),后者则擅长应对同一问题下多种可选算法或规则的灵活切换(如支付方式选择)。 理解这种“形似而神异”的区别,能帮助我们在设计时避免误用,让模式真正为业务逻辑服务。

IT 累计浏览 2,940

简单工厂模式:计算器类

这篇讲的是如何用计算器这个经典例子,把简单工厂模式讲明白。作者从实现一个支持加减乘除的计算器出发,展示了如何用一个工厂类根据用户输入的运算符,来创建并返回对应的运算对象。 文章的核心是剖析这个工厂类的结构:它把对象创建的逻辑集中起来,让客户端(计算器界面)只需要告诉工厂“要什么运算”,而不用关心具体类怎么实例化。这种解耦让新增运算(比如取余)变得简单——只需扩展运算类和修改工厂方法,而不必改动客户端代码。 值得注意的是,作者也点明了简单工厂模式的局限性:当运算类型非常多时,工厂方法会膨胀成一个臃肿的条件判断集合。这时,工厂方法模式或抽象工厂模式可能是更清晰的选择。文章最后用计算器的场景收尾,帮你理解在什么规模下用这个模式最合适。

IT 累计浏览 6,940

JavaScript Interface 接口的实现

这篇讲的是如何在JavaScript中实现接口机制。JavaScript作为弱类型语言,类型匹配问题难以追踪,而且不像其他语言那样提供内置的接口创建或实现方法,这使得对象转化和代码维护变得特别棘手。作者从这个背景问题出发,深入探讨了在JavaScript中模拟接口的核心实现思路。 文章详细介绍了通过函数、对象字面量和原型链等特性来定义接口约束,并实现轻量级的类型检查。例如,利用构造函数或ES6的类来模拟接口定义,再通过检查对象是否满足特定方法或属性来实现“鸭子类型”的验证。这种方案巧妙地结合了JavaScript的动态特性,在不依赖外部库的情况下,提供了灵活且可扩展的接口模拟方式。关键差异在于,它不像Java或TypeScript那样有严格的编译时检查,而是通过运行时验证来增强代码的健壮性。 整体上,这篇文章展示了如何用JavaScript的现有工具弥补语言设计的缺失,适合那些需要在大型项目中管理类型关系的前端开发者。它强调了在弱类型环境中,通过清晰的接口约定来提升代码可读性和可维护性的实用技巧。

IT 累计浏览 2,580

JavaScript Dynamic Prototype Pattern

这篇从其他语言转向JavaScript的开发者视角出发,探讨了动态原型模式为何会让熟悉传统OOP的人感到“不爽”。作者指出,Java或C#等语言中,类定义、构造函数、成员方法都在同一个结构中清晰划分;而JavaScript却将构造函数(负责初始化)与原型(负责方法共享)刻意分离,这种“混合模式”初看确实显得零散。 文章的核心在于解释这种设计的内在合理性。JavaScript的原型链继承本身是动态且灵活的,但将所有方法直接写在构造函数里会导致每个实例都创建一套方法,浪费内存。单独用原型定义方法虽然高效,却又让方法与构造过程脱节。因此,“动态原型模式”建议在构造函数内部,用条件判断(如`if (!this.hasOwnProperty('methodName'))`)来一次性地将方法添加到原型上。 这既保证了初始化的集中控制,又实现了方法的复用,同时让代码结构更贴近其他语言开发者熟悉的“单一块状定义”习惯。作者其实想说的是,JavaScript的对象模型自成体系,与其强求与其他语言完全一致,不如理解其设计背后的权衡——在内存效率、灵活性与代码组织之间找到那个“十全九美”的平衡点。

IT 累计浏览 4,641

关于架构的一句话,还有一个实例

这篇文章记录了周爱民先生近期的一次分享,他探讨了架构、框架和库的本质区别。其中,他提出了对“架构”的一个精辟描述:“架构是对系统中组件及其关系的高层抽象。” 这个定义抓住了架构设计的核心——它关乎系统的整体骨架与边界划分,而非具体的实现细节。为了让大家更直观地理解,周爱民先生还引用了“把大象装冰箱”这个经典笑话作为实例。从这个例子出发,他阐释了架构(定义步骤与目标)、框架(提供开箱即用的步骤骨架)和库(实现某个具体步骤的工具)各自扮演的不同角色。 理解这一点,能帮助我们在技术选型时分清主次:架构决策决定了系统的演进方向与稳定性,而框架和库则是服务于架构的实现工具。文章的分享提醒我们,在面对复杂系统时,应首先关注那些最高层、最不可变的结构设计。