それは、私が喜んでいる重要なことの主題です Natty Code は、書籍内のインスタンス コードの読み込みが 非常に悪い ことです。 . *[M] 第 3 章「機能」で、Martin は機能を適切に記述するためのさまざまなアドバイスを提供しています。 この章での潜在的に最も強力なアドバイスの割り当ては、無音にする必要がある機能は、もはや抽象化のレベルを組み合わせない[n]ということです。 ; ここでは紛らわしく、特性の説明責任を混乱させるため、彼らはもはや過度の段階と低段階のタスクの両方を構成する必要はありません。 この章には他にも正当な内容があります。Martin は、特徴的な名前は無音で説明的で一定である必要があり、動詞句である可能性が高く、慎重に選択される可能性が高いと述べています。 彼は、能力は 1 つの側面を正確に達成し、それをうまく確立する必要があると言っています。状況によっては、これは非常に非現実的である可能性があります。 彼は、ケイパビリティ セーブはもはやアスペクト結果を必要としない (そして彼は非常に実質的な例を提供している) と述べており、出力引数は戻り値を支持して回避されるべきであると述べています。 彼は、機能は無音である必要があり、一般的に両方とも指示であり、それを 達成する必要があると述べています。 ) 何か、または 返信 するクエリ、しかし今はありませんどちらも長い。 しかし、この章にはさらに疑わしい主張が含まれています。 マーティンは、ブールフラグの引数は意識的に腐敗していると言っていますが、私はそれを信じています。 または 詐欺的 [0] は不透明で不明確です 対 [M] 宣言 IS_SUITE または IS_NOT_SUITE …しかし、Martin の推論は適度に、特性が 1 つの側面よりも大きな影響を与えるというブール論が成り立つというものです。 Martin は、単一のソース ファイルをストーリーとして上から下まで読むことは想像できないと言っています。オン、他のすべての特性を呼び出すすべての特性は、さらにダウンします。 これは、普遍的に関連するものです。 多くのソース レコードデータ、私はほとんどのソース レコードデータとも言いますが、この図ではもはやきちんと階層化することはできません。 そして、これらの可能性がある場合でも、IDE を使用すると、特徴的な名前から特徴的な実装へと簡単にジャンプし、Web サイトを閲覧するのと同じ図を表示できます。
彼は、コードの重複が「マシンのすべての恐ろしさの根源である可能性がある」と述べ、熱心に支持しています ドライ
。 当時、これは適度に習慣的なアドバイスになりました。 それにもかかわらず、ほとんどの新しいケースでは、 1 分のビットの重複はもはやこの地球上で最悪の側面 ; また、より明確になり、実行可能な抽象化. その後イレギュラーになります。 マーティンは、能力は無音である必要があり、もはや盗むのに十分な量である必要があると言います ネストされた 構造体 (条件とループ) に目を光らせます。 同様に、無音にする必要がなくなり、2 レベル以上にインデントする必要がなくなりました。 ブロックは無音で 1 行長くする必要があり、間違いなく 1 つの特徴的な名前で構成される必要があると彼は言います。 彼は、寛大な特性には ゼロの引数 があると言っています (しかし無音のノーアスペクト結果?)、そして壮大な 3 つの引数を持つ特性は混乱し、確認するために洗練されています。 最も奇妙なことに、Martin は寛大な特徴は 2 ~ 4 つのコードのトレースが長くなること であると主張しています。 。 このアドバイスの割り当ては、章の最初に配置された全体的なものです。 それは最初の主要なルールです:ケント[Beck]がコードを確認したとき、私は一度、全体的な能力の軽さに驚かされました。でした。 私はかつて、何マイルもの垂直的な生活を占める Swing アプリケーションの機能に慣れてきました。 この 番組の特徴は、いつの間にか二つ、三つと大きくなり、または 4 つのトレースが延長されます。 すべてが一度透過的に明らかになりました。 誰もがクロニクルを提案しました。 そして、それぞれが説得力のある暴露であなたを次へと導きました. それは無音であるために必要な能力がどれほど短いかです!
私はこれからもう一度言います。ここに、彼の最も深い基準に基づいて書かれた、コードに対する Martin の喜びがあります。 これは、適切な学習例として提示されたものです。 この段階で、私のJava スキルは古くて錆びていて、2008 年に書かれたこの本と同じくらい古くて錆びています。
。初め、クラス名 SetupTeardownIncluder
、 悪い。 それは は です。 、すべてのクラス名が無音である必要があるため、名詞句。 ただし、それは完全に名詞化された動詞句であり、厳密にオブジェクト指向のコードで作業している場合は常に救い出す絞められた大まかなクラス名です。全体を確立するには、クラスにする必要がありますが、一般的に言えば、必要な側面です。壮大な 1 つの単純な 特徴 . クラスを介したすべての図, 私たちは喜んでいます: 2 つのパブリックな静的メソッド、できるだけ早くプラス 1 つの一意の非パブリック コンストラクターと
15 のユニークな非公開メソッドbuildIncludeDirective)。 最も敏感 ル一見 isTestPage および findInheritedPage アスペクト構成が不要であることを考慮に入れます。 それらは、それらに渡されない変数のサウンドレス構成の使用 (pageData および testPage それぞれ) しかし、彼らは 見える アスペクト構成のない方法でこれを達成します。 この時点で、 Martin の "aspect compose" の定義が、記事のメンバー変数で構成されていないことを理由にするのは良いことかもしれません。 この定義を決めると、5つのメンバー変数、 pageData , isSuite 、testPage , newPageContent および pageCrawler[M] 、every に暗黙的に渡されます。 非公開の意図の名前であり、壮大なスポーツと見なされます。 非公開の意図は、これらの変数のいずれかに対して好きな残りを自由に達成できます. しかし、マーティンの定義の喜びはこれと矛盾します。 これは、この正確な章の前半からのもので、強調が追加されています: 副次的な結果は嘘です。 あなたの特性は、1 つの側面を達成することを保証しますが、他の隠れた問題も解決します。 一般的に、これは学校での喜びの変数に予想外の調整を構成する可能性があります. 通常、これにより、特性またはマシン グローバルに渡されるパラメータにそれらを構成できます。 どちらの場合も、しばしばなじみのない一時的な結合をもたらし、依存関係を明らかにする、よこしまで有害な誤解です. 私はこの定義が大好きです。 私はこの定義を信じています。 これは貴重な定義です。入力と出力を最も簡単に参照することで、ある程度の自信を持って、特性が何をするかを推論できるからです。 予期せぬ調整を構成する特性が腐っていることに同意します では、なぜ Martin のコードへの喜び、つまり「魅惑的な」コード、達成 これだけ ? 意図がもう 1 つの意図に議論を急がせることの喜びの駅で、Martin は、最初の意図スペースをメンバー変数にするという悲惨な依存関係を作ります。 これにより、これらの非常に窮屈なメソッドはすべて事実上何も達成せず、アスペクト結果のみを介してのみ機能するため、このコードが何を行うかを解決するのは非常に面倒です.非公開の意図を一つ盛り込みましょう。 非公開文字列 render(boolean isSuite) throws Exception { this.isSuite=isSuite; if (isTestPage()) includeSetupAndTeardownPages(); return pageData.getHtml(); }
それで.. . 誰かがあなたにコーヒーを淹れるように指示しようとしているので、誰かがキッチンに入ることを考慮してください. あなたが慎重に特化していると、彼らは提案された壁をはじきます。 スイッチは繊細なスイッチを崇拝しているように見えますが、キッチン内のライトはどれもオンまたはオフになりません。 続いて、彼らは食器棚を作り始め、マグカップを下に置き、それをワークトップに置き、ティースプーンで 2 回軽くたたきます。 彼らは 30 秒間椅子に座り、最高の状態で冷蔵庫の横に移動し、おそらくもう見えないのではないかと考え、アソート マグカップ、斬新なコーヒーのスタウトです。 ...どんな壮大な駅がありましたか? 何のためにスイッチをフリックしたのですか? の方向の空マグ部分をタップするようになった? コーヒーはどこから来たのですか? なぜ render this.isSuite のコストで構成された環境での喜び? ときは this.isSuite
isTestPage でお読みください、includeSetupAndTeardownPages 、両方で、どちらでもない? サルベージ リード アベットを実行する場合、なぜ今は壮大なラッシュ isSuite ブール値として? それとも、発信者がそれを読む可能性がありますか? なぜ私たちは戻るのですか? pageData.getHtml() 何も触れなかった後pageData ? そこで HTML はどのように回収されましたか? もうそこになった? includeSetupAndTeardownPages という熟練した推測を構成しましょうか。 は pageData にアスペクト結果を持っています でも、その後、何? 因数分解するまで、両方の図を知ることはできません。そして、他のメンバー変数を喜ばせる他の側面は何ですか? 不確実性が非常に大きくなり、isTestPage()この図をどのように見ていきますか? ひょっとして、ひょっとしたらもういいのかもしれません。 もはやユニットではありません。 実際には、コードの他の部分にあるアスペクト結果から切り離すことはできませんでした。 (そして、インデントはどうなっているのですか?そして、確立されたのは中かっこがぶら下がっているのですか?)マーティンは、まさにこの章で、特性をより小さな機能に分割することは理にかなっているということです。 しかし、彼は私たちに次のことを提供します:
- 非公開ブール値 isTestPage() throws Exception { return pageData.hasAttribute("Test"); }
- public class Level { public double x; public double y; とこの例オブジェクトの (まあ、1 つのインターフェイス): パブリック インターフェイス レベル { double getX(); ダブル getY(); void setCartesian(double x, double y); ダブル getR(); double getTheta(); void setPolar(double r, double theta); } Martin は次のように書いています。 これらの 2 つの例は、オブジェクトとデータ構造の間の適応を示しています。 オブジェクトは、抽象化によってデータをマスクし、そのデータに特徴的な機能を表現します。 データ構築はデータを描写するものであり、主要な機能はありません。 突進し、もう一度それをすくい取ります。 2 つの定義の補完的な性質を見てください。 それらは事実上正反対です。 この区別はおそらく些細なことのように思えるかもしれませんが、長い道のりを歩む意味があります.
以上です?
いいですね。 マーティンの「データ構築」の定義は、他の人が使用する定義と一致しません。 これは非常になじみのない定義の違いですが、Martin はもはや彼の用語を明確に概説していないという議論の余地のない真実にもかかわらず. 退屈なデータとしてのオブジェクトと、メソッドを使用した洗練された抽象化としてのオブジェクトを明確に区別することは正当であり、貴重です。 しかし、本の中に情報がまったくないまったくを使用した魅力的なコーディングについて私たちのほとんどが、有効なデータ構造であるためのヒントで喜んでいるもの : 配列、連結リスト、ハッシュ マップ、バイナリ ツリー、グラフ、スタック、キューこの章は 壮大な 思ったより短く、コストの非常に詳細なデータ *
これで、メモの全体的な緩和を再ハッシュするつもりはありません。 私はそれらを別のものにしましたが、この本で実行可能であると私が疑っている合計ロットを呼び出すことは、おそらく逆効果になる可能性があります. サンプル コードの 1 つの余分な悪質な割り当てを中止します。 これは、第 8 章のトップ ナンバー ジェネレーターからのものです:
- パッケージliteratePrimes; import java.util.ArrayList; public class PrimeGenerator { 非公開 static int[] 素数; 非公開 static ArrayList multiplesOfPrimeFactors; protected static int[] generate(int n) {素数=一意の int[n]; multiplesOfPrimeFactors=一意の ArrayList (); set2AsFirstPrime(); checkOddNumbersForSubsequentPrimes(); 素数を返します。 } 非公開 static void set2AsFirstPrime() {素数[0]=2; multiplesOfPrimeFactors.add(2); } non-public static void checkOddNumbersForSubsequentPrimes() { int primeIndex=1; for (int 候補=3; primeIndex
- 一体このコードは? このアルゴリズムは何ですか? これらの 意図名 は何ですか? set2AsFirstPrime ? smallestOddNthMultipleNotLessThanCandidate ? int[]
2 番目の ArrayList ? 以前、意図は無音で露出する必要があると言われていましたが、そうです 何か、または問い合わせる、どのソリューション )何か、しかし今では両方ではありません。 これはかつては確固たるアドバイスだったのに、なぜこれらのメソッドのほぼすべてがそれを無視するのでしょうか? では、スレッドのセキュリティについてはどうでしょうか? これは、コードを荒らすことを意図したものですか? これは、素数を確認するための読みやすく、輝かしい意図を意図したものですか? これを崇拝するコードを書くべきですか? そして、今ではなくなったのなら、なぜこの例が本の中にあるのでしょうか? そして確立は「有効な」回答ですか? ここがこのプログラマーが書いた通常のコードなら生産 — 寛大な状況の下で、余暇の喜びで、有効な生産機械のトレンドの圧力はまったくありません 教訓的な例として — それでは、なぜ彼の本の残りの部分にまったく配慮を払う必要があるのでしょうか? それとも彼の他の本に? * 他の人が指摘するのを盗み見たので、このエッセイを書きました Natty コード 。 私はアンチアドバイスを提供する必要性を感じました。 Natty Code 仕事で組織された読書グループの一員として。 私たちは 13 週間、1 週間に 2 つの章を読みました。 (この本には 17 の章がありますが、すでに説明した原因のために一部をスキップしました。) さて、あなたはそうします。全会一致の同意だけですべてのセッションを中止するためにリーディンググループを救うことをもはや望んでいません. 読者からの大まかな反応を図式化する本が必要であり、それに応えて主張する追加の何かが必要です。 そして、私は、本が両方とも言わなければならないことを意味する、特定の範囲で述べます あなたが同意しない何か、または今はあなたが疑うすべてのことを言わないでください。 その土台の上で、 Natty Code は一度 になりましたわかった。 私たちは真剣に話し合いました。 私たちは、正確なのより深い議論のための立ち上げの意図として、特定の人物の章を利用するという苦境にありました。 新しい慣行。 私たちは、今では本ではカバーされなくなった一対の実質的な取引について話しました. この本を挙げていいですか? いいえ上記の全体的な警告とともに、初心者のテキスト情報としてそれを? いいえ。それを歴史的な成果物、2008 年に崇拝されるようになったプログラミングの最も簡単なプラクティスのチュートリアルのスナップショットとして示すことができますか? いいえ、私はもうしません. * キラーの質問は、別の本としてどの本を示すかということです。 もうわからない。 私がそれらを閉じていない限り、コメント内の戦略. 更新、2020-12-19 以下のコメントからの提案の後、私はJohn Ousterhout 著 A Philosophy of Tool Originate (2018) を読み、偶然それを壮大なエキストラにしました明確な専門知識。 Natty Code. ツールオリジンの哲学 は、Natty Code のドロップイン代替品ではなくなりました。 タイトルが示すように、特定の人物のコードの正確な痕跡を書いたり批評したりするよりも、はるかに大きな段階で機械構成を意識することに重点を置いています。 (そのため、コード例はほとんど含まれていません。)このより大きな段階を対象としているという説明については、完全な初心者プログラマーにとってはもはや正しい読み方ではなくなっていると思います。 この過度の段階の原則の多くは、あいまいであるか、それと比較するための有効な経験に満足するまで意識する必要があります。 本当のことを言うと、エントリー段階の入門プログラミングのテキスト情報が現在正しい市場内にギャップのようなものであるかどうかを判断します.
そんな話をしてたら、たまたまツールオリジンの哲学有益で説得力があり、簡潔で 壮大な 超最新. 私は偶然にも、Natty Code. 。 かなり過激なアドバイスをしてくださったおかげで、正直なところ本の経年変化も適度に良くなっている気がします
言うまでもなく、私がこれを書いている時点で、マシンのトレンドは無音で魅力的です。 正確なプログラミングの本が、さらに 10 年後にどのような影響を与えるかを誰が知っているでしょうか?
あとがき、2022-03-21 このエッセイの読者から寄せられた Natty Code の最も完全な防御は、この本がは 無音決済推奨、上記の異論に関わらず、本の中のアドバイスを完全に文字通りに受け取ったり、独断的に適用したりする必要がなくなったのはそのためです。 読者には、厳しく評価し、結論の喜びを図式化し、そのアドバイスが腐っている場合はそのアドバイスを選択的に無視する責任があります。 本自体にも次のように書かれています:
[M] この本の提案はいずれも物議を醸しています。 あなたは間違いなく、それらすべてをもはや信じていないでしょう。 それらのいくつかに激しく反対するのは良いことです。 それは美しいです。 私たちは最高の権威を主張することはできません. 私はここで、腐ったアドバイスと最初のステーション内の腐ったサンプルコードを含む本の特に説得力のある弁護であると判断しません. 私たちが受動的に私たちを洗い流すのとは異なり、常に主題を厳しく盗む必要があることは素晴らしいことです。 これは広く理解されています。 とは の読み方です。 これが上のエッセイです。 これは無言で語られる必要はなく、本自体が目的を示すのは冗長です。 これは、本を批判から保護するために熟成することさえできる何かが真実であると言われている場合、もはや常にではありません. さらに重要なことは、真実が語られる場合、その本が何を言っているのかということです. そして、特にアカデミックなテキスト情報では、いかに注意深く その本は、特定の専門知識を救い出すのと同じくらい開いて読む必要があり、本が常にそうであるとは限らない場合はどうなるでしょうか。 経験豊富なプログラマーは、Natty Code[M] を読んでもほとんど何も救わないでしょう。 。 彼らはおそらく、与えられたアドバイスと経験の喜びを比較検討し、提案された決定を構成するという苦境に陥るでしょう - そして本は、彼らが何年も前に学ばなかったことを事実上何も示しません. 経験の浅いプログラマ — そして Natty Code はエントリー ステージのプログラミング テキスト情報です。したがって、ここにターゲット市場があり、その経験は重要です。腐っており、インスタンス コードが腐っており、模倣する必要がないことを注視する必要がなくなった可能性があります。 経験の浅いプログラマーは、これらの教訓を額面通りに決定するでしょう。そして、彼らがどれほどひどく誤解されたかを解決するよりも何年も早くなります. - パッケージliteratePrimes; import java.util.ArrayList; public class PrimeGenerator { 非公開 static int[] 素数; 非公開 static ArrayList multiplesOfPrimeFactors; protected static int[] generate(int n) {素数=一意の int[n]; multiplesOfPrimeFactors=一意の ArrayList (); set2AsFirstPrime(); checkOddNumbersForSubsequentPrimes(); 素数を返します。 } 非公開 static void set2AsFirstPrime() {素数[0]=2; multiplesOfPrimeFactors.add(2); } non-public static void checkOddNumbersForSubsequentPrimes() { int primeIndex=1; for (int 候補=3; primeIndex
と: 非-public WikiPage findInheritedPage(String pageName) throws Exception { return PageCrawlerImpl.getInheritedPage(pageName, testPage); } と半分他にも十数個ありますが、それらのどれも、1 つ以上の命令から呼び出されることさえありません。 もはや、このコードの疑わしい側面の 1 つほど多くはありません。これは、真実がマーティンのせいであると言われても、常にそうではありません: pageData の情報が破棄されます。 メンバー変数 (isSuite とは異なります, testPage , newPageContent および pageCrawler ), pageData 本当のことを言えば、私たちの変化はもうありません。 一時停止段階のパブリックに渡されたオリジンには長い道のりがあります render
この本は Java コードを専門としており、代替プログラミング言語や他のオブジェクト指向プログラミング言語を除外しています。 Java はかつて人気がありました。本を書いているのであれば、Java はよく知られている単一の言語を持ち、それを使い続けることは理にかなっています。この目的のための好み。 しかし、この本の全体的な Java の使用は驚くほど古いものです。不完全に。 それが理由の一部です Natty Code がかつて推奨される読み物になったことがあり、私は今判断します振り子が不正確な図の中でぶらぶらと揺れていることを. Javaのノウハウ、提供コードのグランドは腐です。 ユニット編成の章があります。 この章には、ユニット評価が無音で、迅速で、自立的で、反復可能である必要がある方法、ユニット評価がソースコードのリファクタリングを非常に自信を持って可能にする方法、ユニット評価が無音である必要がある方法について、さまざまな頑固でお気に入りの内容があります。以下のコードを見てみましょう。ただし、厳密には読みやすく理解しやすいコードです。 しかし、それから彼は、彼が言うことはあまりにも壮大すぎる詳細であるユニットを見てみましょう: @Test public void turnOnLoTempAlarmAtThreashold() throws Exception { hw.setTemp(WAY_TOO_COLD); controller.tic(); assertTrue(hw.heaterState()); assertTrue(hw.blowerState()); assertFalse(hw.coolerState()); assertFalse(hw.hiTempAlarm()); assertTrue(hw.loTempAlarm()); } そして彼は誇らしげにそれを次のようにリファクタリングします:
@Test public void turnOnLoTempAlarmAtThreshold() throws Exception { wayTooCold() ; assertEquals(“HBchL”, hw.getState()); } 実行される独自の環境宣言を発明し、評価のために言語を分類することの利点の範囲内での全体的なレッスンの一部として。 私はかつてこの提案に非常に戸惑いました。 まったく同じコードを使用して、別のレッスンを正確に印象付けます。 これを達成しないでください! wayTooCold。 これは形容詞句です。 この図が何をするのかは完全に不明です。 スペース環境の指示で、ダイアグラムが冷たすぎるのでしょうか? 環境の指示に反応
するか[0] なる 図が冷たすぎる? それともとりあえず環境が指示する主張なのかする必要があります 図が冷たすぎますか? 動詞や動詞句名を喜ばせるテクニックが必要です 後払い, deletePage または 置く。 それはもはや私が主張することではありません。 それはこの本からの瞬時の引用です。 第 2 章「意味のある名前」:
*動詞や動詞句名を喜ばせるテクニックが必要 後払い, deletePage または 置く。 これは完全に健全なアドバイスです。 そして hw.setTemp(WAY_TOO_COLD); は、かつては素晴らしく明確なコード行になりました。 そして、あなたがその呼びかけを正確に推測するという議論の余地のない真実にもかかわらず [M] wayTooCold() devices 温度が冷やしすぎて... controller.tic() も呼び出すと推測するとよいでしょう。 初めの。 以前は、アスペクト結果を持つコードを避けるように言われていました。 これも、かつては健全なアドバイスになりました。 そして、それはまた、カテゴリ別に記述されたコード例の中で除外されています. (そして、ここにある、リファクタリングされていない特徴的なコードは、飾り気のないブール値の欠点を見事に示しています。たとえば、coolerState は を返しますmagnificent? それは、クーラーの最新の命令が正しいことを示していますか ie フロスティ アンプル、ie[M] スイッチがオフになっていますか? それとも、電源が入っていて、アクティブに冷却されていることを示していますか? enum 約 a 値、 ON と OFF、あいまいさが少なくなる可能性があります。)
本は私たちに TDD
第一法 失敗したユニットを見て喜ぶまでは、本番用のコードを書かない方が良いかもしれません.
二次法則たぶん、失敗するのに十分な量を超えてユニットを見てみる必要がなくなり、コンパイルが失敗することもなくなりました.
三番目律 いいのかも今は、急いで見て失敗するのに十分な以上の余分な生産コードを書くことはもうありません. これらの 3 つの刑務所のガイドラインは、30 秒延長される可能性があるサイクルにあなたをロックします。 評価と本番コードはまとめて書かれており、本番コードよりも1秒ほど早く評価が見事です
%%item_read_more_button% %