第三章 工作代码是不够的(战略与战术编程)

好的软件设计中最重要的元素之一是您在执行编程任务时所采用的思维方式。许多组织都鼓励采取战术思维方式,着眼于使功能尽快运行。但是,如果您想要一个好的设计,则必须采取更具战略性的方法,在此上花费时间来制作干净的设计并解决问题。本章讨论了从长远来看,为什么战略方法可以产生更好的设计,而实际上却比战术方法便宜。

第二章 复杂性的本质

这本书是关于如何设计软件系统以最小化其复杂性。第一步是了解敌人。究竟什么是“复杂性”?你如何判断系统是否过于复杂?是什么导致系统变得复杂?本章将在较高层次上解决这些问题。后续章节将向你展示如何从较低的层次上根据特定的结构特征来识别复杂性。

第一章 介绍

编写计算机软件是人类历史上最纯粹的创作活动之一。程序员不受诸如物理定律等实际限制的约束。我们可以用现实世界中永远不会存在的行为创建令人兴奋的虚拟世界。编程不需要很高的身体技能或协调能力,例如芭蕾或篮球。所有编程都需要具有创造力的头脑和组织思想的能力。如果您可以可视化系统,则可以在计算机程 序中实现它。

前言

80 多年来,人们一直在为电子计算机编写程序,但令人惊讶的是,关于如何设计这些程序或什么是好的程序应该是什么样子的讨论却很少。关于软件开发过程(如敏 捷开发)和开发工具(如调试器、版本控制系统和测试覆盖工具),已经有了相当多的讨论。还广泛分析了编程技术,如面向对象编程和函数式编程,以及设计模式和算法。所有这些讨论都是有价值的,但是软件设计的核心问题在很大程度上仍然没有触及。David Parnas 的经典论文“关于将系统分解成模块的标准”发表于 1971 年,但是在随后的 45 年里,软件设计的技术水平并没有超过这篇论文。

You can also use the Month enum from the java.time package to convert the month number to the month name. This enum is part of the modern Java date and time API, which was introduced in Java 8 and is the recommended way to work with dates and times in Java. Here's an example of how to use it:

To deep copy a List<Map<String, String>> in Java, you can use the clone() method. This method will create a new List object that contains the same maps as the original list, but the maps themselves will be new objects, rather than references to the original maps.

你说的是 synchronization?这个有翻译的问题,当然也有你对 synchronization 概念理解的问题。很多人觉得 synchronization 指的就是互斥,操作层面这么说其实也没什么问题,毕竟,但凡被标记成 synchronized 的代码段,同一时间只有一个线程可以被准入。不过互斥并不是synchronization 的目的,只是达到 synchronization 的手段。

以下列出一个学习提纲,主要针对的是有经验的人,初学者不合适。这个提纲只能用于一般的庸俗编程语言学习,目前在流行编程语言排行榜上排前20的基本上都是庸俗语言。如果你要学的是LISP之类非庸俗语言(这就是普通人驾驭不了的语言),或是某个软件中的二次开发语言,这里的建议未必合适。还是那句话,仅供参考。

最初,你可以将模式视为解决特定类问题的一种特别巧妙且有深刻见解的方法。这就像前辈已经从所有角度去解决问题,并提出了最通用,最灵活的解决方案。问题可能是你之前看到并解决过的问题,但你的解决方案可能没有你在模式中体现的那种完整性。

编程范式

所谓编程范式(Programming Paradigm),指的是计算机编程的基本风格或典范模式。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。

什么叫匿名类

Java 的匿名类(也叫匿名内部类,因为肯定在某个类的内部)是没有名称的类。因为没有名称就无法在别的地方调用,只能在定义的时候调用了。