阅读更多

0顶
1踩

非技术
Bug 少,性能好,容易修改。好的代码影响深远,而且它可能是产生 10 倍工作效率的开发者的主要原因。尽管好代码十分重要,但开发新手却不得要领。关于这一主题的技巧多而冗杂,让新手们如何记得住?“Code Complete(《代码大全》)” 是这个主题的经典,但内容多达 960 页!

我认为应该建立起良好的心态,这样,不管你用什么语言或者库,都会自然而然的写出高质量的代码。这里我主要谈到 5 个相关的概念。记住它们,轻松写出写出好代码。

避免特立独行
当你读到一些文章中的新技巧时,如醍醐灌顶,一定会想要写点看起来很聪明的代码,让同行们眼前一亮。

问题是人们只是想修完 BUG,然后继续处理其它事情。那些聪明的技巧常常只会成为一种消遣。我曾经在“将神经科学应用于软件开发”中谈到,当人们被迫花心思来理解你的某段代码时,它们的“精神堆栈”会迅速填满,因而难以理解其中深意。

[译者注:图片中的注释内容:这在 C 语言中用于避免误写成 variable = null。最近它造成不少人困惑,但似乎并没带来多大好处]

不要在工作中使用太多可能需要额外解释的个性化方式。

不要用“你的方式”来编写代码,只需要按照标准(的代码规范)来编写就好。再次强调,要写让人读得明白,看得下去的代码,让人家能够理解它。

分而治之
模块化可以使复杂的代码结构变得清晰,除此之外还有很多方法可以达到同样的目的,而无需创建更多函数。将长长的条件表达式保存为一到两个变量就是个不错的方法,可以避免调用函数的开销。这些变量可以用在其它地方,甚至可用于组合更复杂的条件。

拆解问题的方法在于尽可能的让每个部分保持集中,只影响局部状态,不要混入不相关的问题,要避免副作用。编程语言和库通常会带来各自相应的问题,避免这些问题可以让你的代码更专注于其表达的业务。单一责任原则就是通过集中代码和局部化代码带来良好设计的例子。

[译者注:图中注释内容:这是不需要额外函数开销的一种模块化方法]

我喜欢利用变更来进行逻辑划分。

TDD(Test Driven Development,测试驱动开发)的成功实施表现出了它所带来的好处,它迫使人们运用一些以前不受欢迎的准则。无状态的代码曾经被嫌弃又慢又没必要(大部分老的 C/C++ 代码中可以看到),然而现在每个人都在谈论纯函数。就算你不采用 TDD,你也应该学习它背后的原则。在新的模式下工作会让你成为适应性极强的开发者。

分离代码并使其可分别处理
你写代码的时候面临着什么样的困难,你的计算机和工具也面临着同样的困难。代码的复杂性,与需要进行的预处理和需要处理的突发情况存在着或多或少的联系。

现在暂时抛开那些额外的构建工具所带来的好处。它们需要你使用特定领域的语言,比如自定义模板,或者复杂的动态数据结构,比如哈稀表。IDE 通常不善于处理这些东西,要找到相关的代码段则更加困难。

尽量避免使用不能很好支持 IDE 的语言扩展和库。它们给你的生产力带来的好处,远大于简易配置和用简洁语法保存击键带来的小便利。

[译者注:图中注释内容:使用神奇的字体串可能造成 IDE 不能正确识别你的代码]

ServiceLocator 是与 IDE 整合不佳的一个设计样例。

另一个保持 IDE“整合度”的相关方法是避免编写特殊的代码。多数语言都提供了编写动态代码的能力。如果滥用这些特性,比如特殊的字符串、特殊的数组索引和自定义模板语言特性等,会产生难以连接的代码库[译者注:这里的连接应该是指相互关联的关系,连接最直接的影响是在使用 IDE 等工具进行重构的时候可以自动根据连接关系修改相关引用]。一般说来,那些只有你一个人才能看懂的特性会让你摔跟头的,因为如果 IDE 不能理解这些代码,在你想进行结构调整的时候,IDE 就没法帮你进行重构。

让程序可读
致力于可预测的架构。这种架构下你的队友要进行某项查找就会很容易,可以节约不少时间。一旦你为项目确定了一个整体的架构,就一定要把主要元素放在显眼的位置。使用 MVC?把模型、视图和控制器放在他们自己的目录下,不要放在三个深层次的目录中,也不要放在几个不同的地方。

我在前面谈到了模块化。也存在过度的模块化,让定位代码这种事情变得艰难无比。IDE 可能会带来一些帮助,但通常你往往会让 IDE 忽略库目录,因为其中有很多不相关的代码,或者它的索引需要人工处理一些问题,就会造成两败俱伤的局面。尽量使用较少的库,选用那些尽可能多覆盖你需求的库。

库和工具也可能成为新人的障碍。我最近使用 EcmaScript 7 (babel) 构建了一个项目,后来我才意识到我们的初级开发人员一直因为想搞明白它而卡在那里,这对团队的生产力造成了巨大损失。我低估了这对一个新手所带来的压力。不要使用对当前来说太难掌握的工具,等时机成熟再使用。

这是我写的一个 makefile 中的真实代码。新手不需掌握过多的新技术。

让代码易于理解
如果你已经做到了这一点,那我们来解决更重要的问题——选择好名字,这是软件开发中的重要部分。构建工具在这方面不能提供帮助,原因很简单,计算机不会真正知道解决方案背后的逻辑。你得通过文档来解释代码,而与主题相关,且符合上下文,体现变量和功能的名称就能很好做到这一点。语义化的名称甚至可以减少对文档的需求。

在名称中使用前缀对理解它们很有帮助。这在过去是一种流行的做法,我认为对这种作法的误用导致了它的消亡。像匈牙利命名法这样的前缀系统最初只是为了增加意义,但最后用于其中的上下文越来越少,终于少得只剩类型信息。

[译者注:图中的注释内容:使用名称来表达意图,不要利用语言来耍小聪明]

近来,Fluent 接口经常被滥用。

最后要说说老生常谈的回溯复杂度。简单地说就是要尽可能减少条件分支的数目。每多一个分支都会增加缩进,同时降低可读性。不过更重要的是,增加的东西越多,你需要跟踪的东西就越多。

结论 & 相关阅读
本文介绍了五个简单的总体概念,我希望你能从中轻松的学习到组织代码的方法。

实践是最好的老师,用编程来巩固理论。如果你还没有这样做,我诚挚向你推荐代码大全。它带来了大量的示例,几乎剖析了你可能遇到的每一种问题。

英文原文:Writing good code: how to reduce the cognitive load of your code
  • 大小: 33.7 KB
  • 大小: 44.4 KB
  • 大小: 27.7 KB
  • 大小: 63.1 KB
  • 大小: 35.8 KB
来自: oschina
0
1
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • java给图片添加水印

    java给图片添加水印,网站开发过程中可能需要对上传的图片添加属于本网站的水印,这是一个工具类,能实现添加文字水印和添加图片水印。

  • java实现给图片添加水印(文字水印或图片水印)

    java实现给图片添加水印(文字水印或图片水印)

  • 这三个方法教会你图片怎么加水印

    现如今越来越多的人喜欢在各种平台上分享自己拍摄出来的精美照片,受到其他人的点赞、好评就会觉得拍得很有意义,但是也会担心被部分人随意转发、盗用照片。其实可以在发布前,给要分享的照片添加上我们自己的专属水印,这样子就不会怕有人盗取图片了。小伙伴们想知道图片怎么加水印吗?下面这篇文章教会你怎么给图片添加上专属水印。添加水印的方法一:相册实用指数:★★★☆☆相册是我们储存照片和视频时会用到的软件,但其实它还自带了一些简单实用的小工具,比如:旋转、裁剪、滤镜、文字、贴纸等等,我们需要用它“文本”的工具给图片添加上水印

  • 使用 Java 为图片添加各种样式的水印

    水印是一种覆盖在图像表面上的标识,通常以文字或图像的形式存在。其主要目的是保护图像版权,防止他人在未经许可的情况下使用图片。文本水印:在图像上添加特定的文字信息,如作者名、公司名或版权声明等。图像水印:在图像上添加另一个图像作为水印,如公司 Logo 或品牌标识。平铺水印:将水印图像或文本重复覆盖整个图像区域,以增强保护效果。接下来,我们将逐步介绍如何在 Java 中实现这些不同类型的水印,并探讨如何根据实际需求进行自定义和优化。Graphics2D是类的子类,提供了更强大的图形处理能力。

  • Java对图片进行添加水印操作

    java封装图片加水印工具类

  • 使用Java实现添加文字水印、图片水印功能实战

    本文介绍java实现在图片上加文字水印的方法,水印可以是图片或者文字,操作方便。java实现给图片添加水印实现步骤:获取原图片对象信息(本地图片或网络图片) 添加水印(设置水印颜色、字体、坐标等) 处理输出目标图片 一、java实现给图片添加文字水印 1.获取原图片对象信息 第一步:获取需要处理的图片获取图片的方式,通常由两种:一种是通过下载到本地,从本地读取(本地图片); 另外一种是通过网络地址进行读取(网络图片) 1.1 读取本地图片 图片 通过代码实现读取本地目录(F:\image\1.png)下图片

  • 怎样在图片上添加水印?这份水印处理教程快来收好

     不管是自己设计的海报,还是摄影作品,在发布到平台之前,我们都很有必要为图片加上自己的水印,以此保护其不被他人恶意盗取。可能还有些小伙伴不知道图片如何加水印,没关系,下面我给大家分享几个实用方法,有需要的小伙伴快来学这几招加水印技巧傍身!方法一:使用图片转换器来给图片加水印易操作指数:★★★★☆这款迅捷图片转换器从名字不难看出,它是一款支持图片格式转换的图片处理工具,可以对jpg、png、bmp等上百种图片格式进行互转;除此之外,也可以实现对图片进行水印处理、照片修复、抠图、压缩等多种操作

  • Java给图片增加水印,根据图片大小自适应,右下角/斜角/平铺

    水印就是在图片上绘画,文字水印是最常见的,比如CSDN文章里图片右下角就会有文字水印 在 Java 中,给图片添加水印一般可以分为以下几步 1. 读取图片 2. 获取/创建图片画板 3. 将水印内容绘制到图片中 4. 输出图片 效果展示 下面展示的是我所使用的水印效果

  • 图片加水印 java代码实现

    图片加水印 java代码实现

  • 给图片加水印

    1.VB写的小程序给图片增加水印,默认把图片拍摄日期作为水印;

  • CSDN上传图片对水印操作

        在 CSDN 中上传图片时,会默认添加一个水印。有时在图片中添加水印时会使得图片模糊不堪,甚至会导致图片中某些关键信息被掩盖。这时,抹去图片水印或水印自定义就显得尤为重要啦!接下来,咱们就一起测试一下各种效果。 首先是没有经过处理的图片:                                           下面是插入图片的时候编辑器中生成的代码:  https:/...

  • 用Java给图片添加文字或图像水印

    (20080318_3)用Java给图片添加文字或图像水印【Java水印.rar】文件大小:108 KB (111,078 字节)解压后是Java源代码。

  • java给图片添加平铺文字水印并保留原像素(一)

    先放一张效果图 水印工具类 import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; import lombok.extern.slf4j.Slf4j; import javax.imageio.ImageIO; import java.awt.*; import java.awt

  • java实现给图片添加水印

    周末在家上围脖,看到sina围脖上图片都有水印,想到Java有专门Image的处理包,同样应该可以实现水印功能,查了资料小试下来发现java实现水印还是非常方便的,水印可以是图片或者文字,而且还可以选择不同的角度旋转呢,以后有需要可以写个代码批量处理自己的图片了。   本门目

  • 图片加水印

    public static void main(String[] args) throws IOException { BufferedImage src=ImageIO.read(new File("a.jpg")); //原图 BufferedImage wa=ImageIO.read(new File("b.png")); //水印 int width =

  • 图片添加水印

    using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;class a{ //添加图片水印的方法: ///     /// 加图片水印    ///     /// 文件名    /// 水印文件名    /// 图片水印位置 0=不使用 1

  • opencart图片添加水印watermark插件

    功能: 1. 为图片添加水印; 2. 水印可以是图片或文字; 3. 可设置水印在图片上的五个位置(左上、右上、中部、左下、右下); 4. 多种文字水印的字体可供选择; 5. 针对多商店; 安装使用: 1. 确保为opencart安装了VQMOD; 2. 下载并解压缩; 3. 在你安装使用本插件之前,建议你对文件进行备份; 4. 将解压缩后的文件目录复制到你的网站根目录;

  • 图片添加水印的方法,这个真的很实用!

    经常刷微博或者知乎的小伙伴都应该知道,很多图片都是带有作者专属水印的,这是用来保护自己的版权,减少图片被剽窃的机率。想要解决这个办法的时候,我们就需要给图片加上水印了。今天我们就简单的来看看,小编这里推荐的方法,很简单也很方便,话不多说,上教程! 步骤一:我们在浏览器上搜索“水印云”,点击“立即体验”。 步骤二:注册一个账号并登录,点击“图片加水印”; 步骤三:点击“添加文件”,并本地上传图片; 步骤四:选择右上角“添加图片水印”,并...

  • java 显示水印增加

    给图片增加盲水印 /** * 添加文字水印的方法 * 带下超过20M 和图片像素超过 9999的直接拒绝 * * @param pressText 要添加的文字 * @param fileId 文件Id * @param fontName 文字的字体名称 * @param fontSize 文字的大小 * @param fontColor 文字的颜色 * @return */ publ.

Global site tag (gtag.js) - Google Analytics