Files
org_web/output/posts/clean-code/clean-code-chapter-5.html

561 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2025-08-28 Thu 17:45 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Clean Code: Chapter 5 Notes</title>
<meta name="generator" content="Org Mode" />
<style type="text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<link rel="stylesheet" href="/assets/styles/style.css" />
<link rel="stylesheet" href="/assets/styles/bigger-picture.min.css" />
<script src="/assets/scripts/script.js" defer></script>
<script src="/assets/scripts/bigger-picture.min.js" defer></script>
<script src="/assets/scripts/svg-pan-zoom.min.js" defer></script>
<script src="/assets/scripts/gallery-init.js" defer></script>
</head>
<body>
<div id="preamble" class="status">
<div class="banner-header">
<a href="/"> <img src="/assets/images/gr.png" alt="Site Logo" class="banner-logo" /> </a>
<nav>
<a href="/">Home | </a>
<a href="/posts/posts-list.html">Posts | </a>
<a href="/blogs/blogs-list.html">Blogs | </a>
<a href="/contact.html">Contact</a>
</nav>
<button class="theme-toggle" id="theme-toggle" type="button" aria-label="Toggle dark mode">🌗 Theme</button>
</div>
<div id="updated">Updated: 2025-08-28 Thu 17:03</div>
</div>
<div id="content" class="content">
<h1 class="title">Clean Code: Chapter 5 Notes</h1>
<div class="filetags"><a href="/categories.html"> <span class="post-tag">books</span> </a> <a href="/categories.html"> <span class="post-tag">notes</span> </a></div>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#orgd0110e3">Chapter 5: Formatting</a>
<ul>
<li><a href="#org3fcbb7b">Vertical Formatting</a>
<ul>
<li><a href="#org112c082">Vertical Density</a></li>
<li><a href="#org5960270">Vertical Distance</a></li>
<li><a href="#org298ae14">Conceptual Affinity</a></li>
<li><a href="#org7badd36">Vertical Ordering</a></li>
<li><a href="#org2ec4ff8">Summary - vertical</a></li>
</ul>
</li>
<li><a href="#orge6c1094">Horizontal Formatting</a>
<ul>
<li><a href="#orgfc5c376">Horizontal Openness and Density</a></li>
<li><a href="#org1f66087">Horizontal Alignment</a></li>
<li><a href="#org47bba53">Indentation</a></li>
<li><a href="#orgd5dbd58">Dummy Scopes</a></li>
</ul>
</li>
<li><a href="#orgd230786">Team Rules</a></li>
<li><a href="#orgfb1d75c">Uncle Bobs Formatting Rules (Example in CodeAnalyzer.java)</a></li>
</ul>
</li>
</ul>
</div>
</div>
<p>
Link to <a href="clean-code-chapter-4.html">Chapter 4</a> | Link to <a href="clean-code-chapter-6.html">Chapter 6</a>
</p>
<div id="outline-container-orgd0110e3" class="outline-2">
<h2 id="orgd0110e3">Chapter 5: Formatting</h2>
<div class="outline-text-2" id="text-orgd0110e3">
</div>
<div id="outline-container-org3fcbb7b" class="outline-3">
<h3 id="org3fcbb7b">Vertical Formatting</h3>
<div class="outline-text-3" id="text-org3fcbb7b">
<ul class="org-ul">
<li>Vertical openness (blank lines) separates concepts and improves readability.</li>
<li>Too much density makes code look like a muddle and harder to scan.</li>
</ul>
</div>
<div id="outline-container-org112c082" class="outline-4">
<h4 id="org112c082">Vertical Density</h4>
<div class="outline-text-4" id="text-org112c082">
<ul class="org-ul">
<li>Tightly related lines should appear vertically dense.</li>
<li>Avoid useless comments that interrupt association.</li>
<li>Example (bad):</li>
</ul>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">public</span> <span class="org-keyword">class</span> <span class="org-type">ReporterConfig</span> {
<span class="org-doc">/**
* The class name of the reporter listener
*/</span>
<span class="org-keyword">private</span> <span class="org-type">String</span> <span class="org-variable-name">m_className</span>;
</pre>
</div>
<ul class="org-ul">
<li>Example (better):</li>
</ul>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">public</span> <span class="org-keyword">class</span> <span class="org-type">ReporterConfig</span> {
<span class="org-keyword">private</span> <span class="org-type">String</span> <span class="org-variable-name">m_className</span>;
<span class="org-keyword">private</span> <span class="org-type">List</span>&lt;<span class="org-type">Property</span>&gt; <span class="org-variable-name">m_properties</span> = <span class="org-keyword">new</span> <span class="org-type">ArrayList</span>&lt;&gt;();
</pre>
</div>
</div>
</div>
<div id="outline-container-org5960270" class="outline-4">
<h4 id="org5960270">Vertical Distance</h4>
<div class="outline-text-4" id="text-org5960270">
<ul class="org-ul">
<li>Related concepts should be kept close together to reduce scrolling and searching.</li>
<li>Local variables → as close to use as possible, usually at top of function.</li>
<li>Control variables → declared inside loop headers.</li>
<li>Instance variables → declared at the top of class (common Java convention).</li>
</ul>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">for</span> (<span class="org-type">Test</span> <span class="org-variable-name">each</span> : tests) {
count += each.countTestCases();
}
</pre>
</div>
<ul class="org-ul">
<li>Dependent functions: caller above callee for natural top-down reading.</li>
</ul>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">public</span> <span class="org-type">Response</span> <span class="org-function-name">makeResponse</span>(...) {
<span class="org-type">String</span> <span class="org-variable-name">pageName</span> = getPageNameOrDefault(request, <span class="org-string">"FrontPage"</span>);
loadPage(pageName, context);
<span class="org-keyword">return</span> makePageResponse(context);
}
<span class="org-keyword">private</span> <span class="org-type">String</span> <span class="org-function-name">getPageNameOrDefault</span>(<span class="org-type">Request</span> <span class="org-variable-name">request</span>, <span class="org-type">String</span> <span class="org-variable-name">defaultPageName</span>) { ... }
</pre>
</div>
</div>
</div>
<div id="outline-container-org298ae14" class="outline-4">
<h4 id="org298ae14">Conceptual Affinity</h4>
<div class="outline-text-4" id="text-org298ae14">
<ul class="org-ul">
<li>Group functions with similar naming or shared purpose.</li>
<li>Example (JUnit assert methods):</li>
</ul>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">static</span> <span class="org-keyword">public</span> <span class="org-type">void</span> <span class="org-function-name">assertTrue</span>(<span class="org-type">String</span> <span class="org-variable-name">message</span>, <span class="org-type">boolean</span> <span class="org-variable-name">condition</span>) { ... }
<span class="org-keyword">static</span> <span class="org-keyword">public</span> <span class="org-type">void</span> <span class="org-function-name">assertTrue</span>(<span class="org-type">boolean</span> <span class="org-variable-name">condition</span>) { ... }
<span class="org-keyword">static</span> <span class="org-keyword">public</span> <span class="org-type">void</span> <span class="org-function-name">assertFalse</span>(<span class="org-type">String</span> <span class="org-variable-name">message</span>, <span class="org-type">boolean</span> <span class="org-variable-name">condition</span>) { ... }
<span class="org-keyword">static</span> <span class="org-keyword">public</span> <span class="org-type">void</span> <span class="org-function-name">assertFalse</span>(<span class="org-type">boolean</span> <span class="org-variable-name">condition</span>) { ... }
</pre>
</div>
</div>
</div>
<div id="outline-container-org7badd36" class="outline-4">
<h4 id="org7badd36">Vertical Ordering</h4>
<div class="outline-text-4" id="text-org7badd36">
<ul class="org-ul">
<li>Organise code top down:
<ul class="org-ul">
<li>High-level concepts first (main logic).</li>
<li>Lower-level details later.</li>
</ul></li>
<li>Readers can skim like a newspaper: important first, details last.</li>
<li>Contrast: C/C++ require declarations before use, Java does not.</li>
</ul>
</div>
</div>
<div id="outline-container-org2ec4ff8" class="outline-4">
<h4 id="org2ec4ff8">Summary - vertical</h4>
<div class="outline-text-4" id="text-org2ec4ff8">
<ul class="org-ul">
<li>Use vertical openness to separate concepts.</li>
<li>Use vertical density to group related ones.</li>
<li>Keep related variables, methods, and concepts close together.</li>
<li>Order code top down for natural readability.</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-orge6c1094" class="outline-3">
<h3 id="orge6c1094">Horizontal Formatting</h3>
<div class="outline-text-3" id="text-orge6c1094">
<p>
Keep lines short. Most professional code naturally stays within ~45 characters, with ~80 as an upper bound. Lines beyond 100120 characters are generally careless.
</p>
<p>
Avoid shrinking font or overly wide monitors to fit more code, readability &gt; fitting more characters.
</p>
<p>
Example limit guideline:
</p>
<div class="org-src-container">
<pre class="src src-java"><span class="org-comment-delimiter">// </span><span class="org-comment">Good (short)
</span><span class="org-type">int</span> <span class="org-variable-name">sum</span> = a + b + c;
<span class="org-comment-delimiter">// </span><span class="org-comment">Bad (too long)
</span><span class="org-type">int</span> <span class="org-variable-name">sum</span> = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q;
</pre>
</div>
</div>
<div id="outline-container-orgfc5c376" class="outline-4">
<h4 id="orgfc5c376">Horizontal Openness and Density</h4>
<div class="outline-text-4" id="text-orgfc5c376">
<p>
Use spaces to separate low-precedence operators (e.g., +, -, =) and improve readability.
</p>
<p>
Do not put spaces between function names and parentheses, they are closely related.
</p>
<p>
Example (Quadratic formula formatting):
</p>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">return</span> (-b + Math.sqrt(determinant)) / (2*a);
</pre>
</div>
<p>
Separate arguments with spaces after commas to show distinct parameters.
</p>
</div>
</div>
<div id="outline-container-org1f66087" class="outline-4">
<h4 id="org1f66087">Horizontal Alignment</h4>
<div class="outline-text-4" id="text-org1f66087">
<p>
Avoid aligning variable declarations or assignments in columns, it draws the eye to the wrong place.
</p>
<p>
Long aligned lists usually mean the class is too large and should be split.
</p>
<p>
Example (preferred unaligned):
</p>
<div class="org-src-container">
<pre class="src src-java"><span class="org-comment-delimiter">// </span><span class="org-comment">Prefer this:
</span><span class="org-keyword">private</span> <span class="org-type">Socket</span> <span class="org-variable-name">socket</span>;
<span class="org-keyword">private</span> <span class="org-type">InputStream</span> <span class="org-variable-name">input</span>;
<span class="org-keyword">private</span> <span class="org-type">OutputStream</span> <span class="org-variable-name">output</span>;
<span class="org-comment-delimiter">//</span><span class="org-comment">instead of:
</span><span class="org-keyword">private</span> <span class="org-type">Socket</span> <span class="org-variable-name">socket</span>;
<span class="org-keyword">private</span> <span class="org-type">InputStream</span> <span class="org-variable-name">input</span>;
<span class="org-keyword">private</span> <span class="org-type">OutputStream</span> <span class="org-variable-name">output</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org47bba53" class="outline-4">
<h4 id="org47bba53">Indentation</h4>
<div class="outline-text-4" id="text-org47bba53">
<p>
Indent according to scope hierarchy:
</p>
<p>
Classes → no indent
</p>
<p>
Methods → 1 level
</p>
<p>
Method bodies → 2 levels
</p>
<p>
Inner blocks → +1 for each nesting
</p>
<p>
Indentation makes scopes visually obvious; without it, code is hard to scan.
</p>
<p>
Avoid collapsing scopes onto one line, always use braces and proper indenting.
</p>
</div>
</div>
<div id="outline-container-orgd5dbd58" class="outline-4">
<h4 id="orgd5dbd58">Dummy Scopes</h4>
<div class="outline-text-4" id="text-orgd5dbd58">
<p>
Avoid dummy bodies in loops (e.g., empty while or for loops).
</p>
<p>
If unavoidable, place semicolon on its own indented line to make it visible.
</p>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">while</span> (dis.read(buf, 0, size) != -1)
;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd230786" class="outline-3">
<h3 id="orgd230786">Team Rules</h3>
<div class="outline-text-3" id="text-orgd230786">
<p>
Teams must agree on a single formatting style for consistency.
</p>
<p>
Use IDE formatters to enforce these rules across all files.
</p>
<p>
Consistent formatting builds trust and reduces mental load for readers.
</p>
</div>
</div>
<div id="outline-container-orgfb1d75c" class="outline-3">
<h3 id="orgfb1d75c">Uncle Bobs Formatting Rules (Example in CodeAnalyzer.java)</h3>
<div class="outline-text-3" id="text-orgfb1d75c">
<p>
Short, clear methods with consistent spacing and indentation.
</p>
<p>
Use spaces around assignment and low-precedence operators, no space for high precedence operators.
</p>
<p>
Avoid deeply nested structures. Prefer clear, flat logic.
</p>
<p>
Example snippet:
</p>
<div class="org-src-container">
<pre class="src src-java"><span class="org-keyword">private</span> <span class="org-type">void</span> <span class="org-function-name">measureLine</span>(<span class="org-type">String</span> <span class="org-variable-name">line</span>) {
lineCount++;
<span class="org-type">int</span> <span class="org-variable-name">lineSize</span> = line.length();
totalChars += lineSize;
lineWidthHistogram.addLine(lineSize, lineCount);
recordWidestLine(lineSize);
}
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<footer>
<div class="copyright-container">
<div class="copyright">
Copyright &copy; 2022-2025 Zaine Qayyum. All rights reserved unless otherwise noted.</div></div>
<div class="generated">
Created with <a href="https://www.gnu.org/software/emacs/">Emacs</a> 30.1 (<a href="https://orgmode.org">Org</a> mode 9.7.11) on <a href="https://www.archlinux.org/">Arch</a> <a href="https://www.gnu.org">GNU</a>/<a href="https://www.kernel.org/">Linux</a>
</div>
</footer>
</div>
</body>
</html>