コードの抽象化をどのように処理しますか?


15

新しいコードベースを見るとき、ボトムアップのアプローチから始めたいと思います。
1つのファイルを理解してから、次の抽象化に移動します。
しかし、多くの場合、低レベルの抽象化が行っていることを忘れています。

だから、私はこの時点で、私が以前完全に理解していたファイルに戻って、それらを再学習しようとするほぼ無限のループにいることに気付くでしょう。私の頭の中で互いに接続する他の多くの抽象化をジャグリングしようとしながら。

この状況に対処するためのより良い戦略はありますか?

下位レベルの詳細を忘れて、それを当然のことと考えるべきですか?しかし、それでも、現在の抽象化が何をしているのかを理解するには、以前に低レベルの抽象化を理解しておく必要が何度もあります。



10
短い答え:あなたは間違った終わりから始めています。トップダウンのアプローチは、より効率的になります。なぜなら、あなたが降りる各レベルで、それが何であるか、それが何を意味するかを知るからです。一番下から始めると、必要なコンテキストが不足します。見るものを意味のあるものに関連付けることができないので、これは覚えるのを難しくします。最初に全体像を見て、それを理解してから初めて、核心を知るために必要な/望んでいる部分にズームインしてください。
マーティンマート

頭の中のすべてを覚える必要はありません。紙片やiPadを使用して簡単な図を描くと、関連付けや抽象化を覚えやすくなります。
sul4bh

回答:


31

具体的にプログラミングすると、詳細を自分の方に引き寄せて、1か所で詳細を把握できます。私たちは皆この方法で開始し、手放すのは難しいです。

抽象的プログラミングは、間違いなく「下位レベルの詳細を忘れる」ことです。時には高レベルの詳細も。あなたは詳細を押しのけ、他の人がそれらに対処できるようにします。卑劣なことは、あなたがずっとこれをずっとやってきたということです。その間に何が起こりprint "Hello world"、画面に表示されるかを本当に理解していますか?

これらの詳細を手放すのに苦労するときに要求する一番のことは、良い名前です。良い名前を付けると、中を見ても驚かないでしょう。これがprint、画面に何かを置いても驚くことなく、実際にその方法を気にしなかった理由です。foo "Hello world"別の話だったでしょう。

また、抽象化のレベルは一貫している必要があります。円周率を計算するレベルの場合、円周率を表示する方法について心配する必要もありません。その詳細は、それが属していない抽象化に漏れています。

この1つの場所で考えていることの1つではない、より低い、高い、または横向きの詳細は、完全に消えるか、少なくとも良い名前の後ろに隠れることができます。

あなたがファイルからファイルへのバウンスに本当に苦労しているなら、誰かが悪い名前や漏れやすい抽象化であなたを突き刺した可能性があります。

私は指で読んでこれを修正します。この混乱にまともなテストを行ったら、責任を引き離し、驚きを避ける明確な名前を付け、他の人に見せて、ファンタジーの世界に住んでいないことを確認します。

どうやらこの方法で作業することになると私は一人ではありません:

なじみのないコードに取り組むたびに、メソッドの抽出を開始します。これを行うとき、名前を付けることができるコードのチャンクを探してから、抽出します。後で抽出したメソッドをインライン化したとしても、少なくとも全体的な構造を確認できるように、少なくとも一時的に詳細を非表示にする方法があります。

マイケル・フェザーズ-オレンジコード


12

一番下には、これが私にとって1年の4分の1ごとにどのように変化したかについての更新がいくつかあります。それらは価値があると思います。

良い命名。または、それが他の誰かのコードである場合、そのシステムのクラス/機能の悪い名前にも基づいて良い名前/責任を属性付けしようとするので、私の頭の中で意味があります。一度実行すると、低レベルの実装が覚えやすくなります。

それは私が持っているすべてです。このサイトには多くの純粋主義者がいますが、どんな種類のパターンやオブジェクトを知っているかを神に誓うでしょうが、適切な命名はあなたを遠くに導きます。最小限の文書化/適切な名前/十分に分離されたコードを作成することで、私は自分自身よりも多くのことをしました。私が正しかったことの1つは、コードのフローを説明する適切な名前付け、コメント、および回路図に多くの時間を浪費することでした。あなたが私のコードを深く拡張したいのなら、低レベルの実装が必要です。適切に記述されたコードは合理的な方法で拡張できるため、誰かまたはあなたが低レベルの実装を理解/覚えていなくても大丈夫です。

私と同じように私の元の分野の人々が真実であることを知っているという少しの論争に興味があるなら、ここに書かれていることを聞くと、あなたはこの答えに同意することと同意しないことの両方を学ぶでしょう、先に読んでください:


しかし、ここには別の問題があります-純粋主義者です。合理的で完全に論理的な言葉遣いのある答えとイデオロギーが聞こえます。実際、それらには何も問題はありません。しかし、あなたは彼らに従う必要はありません。実際、彼らはあなたの不利な状況に陥っているかもしれません。

私の友人は大きなシステムで働いていましたが、彼らは慣習やパターンについて少しだけ気にしている人々を笑い飛ばすだけで、正当な理由でそれをやります-私のデータ分析の主な分野からこの理由を見つけることができます、私はそのような経験豊富な開発者ではないので、あなたが考えるものの大部分は重要であり、重要ではありません。この意味であなたのエゴとは強い相関関係があります。多くの場合、個人は、彼のエゴのために、彼が「私と同じこと」を言ったと考える権威によって今や強化されている彼のバイアスのために彼が最も誤解したという知識を得るでしょう。これは非常によく知られたトラップであり、決して陥るべきではありません。だからといって、彼がそれを正しく使っていなかったり、より大きな利益のために使っていたわけではありませんが、多くの場合、これらの人々がすることは、彼らが言っていることが金賞であることを約束することです。

だからあなたは何ができますか?

コードを同僚に説明し、高レベルの観点から意味があるかどうかを尋ねます。

それは重要なことのすべてです。もちろん、誰かのコードを読んでいる人は、常に特定の実装を見るためにalt-tabフェスタを持っていますが、あなたのコードを読んでいる人があなたのシステムの高レベルの理解を持ち、 「(もう一度、必ずしも知っているわけではないが、完全に「どのように起こるか」)、あなたは黄金だ。

これは私が先に進んでパフォーマンスが良くない、または何も尊重しないがらくたコードを書くと言っているのではありませんが、私が言っているのは次のとおりです:

1)忘れても大丈夫です。やがて、作業中のコードを読むのが上手くなります。あなたが読んでいるコードがあなたが良いレベルで低レベルの実装を知っていることを要求するなら、それはひどく書かれたコードであり、私が前に言ったことに遊びます:同僚はあなたを理解していますか?

2)世界は非常に頭が良くない非常に知的な人々でいっぱいです。彼らはまた、しばしば非常に感情的であり、彼らは外部の力からバイアス強化する傾向があります。彼らは何をするのか非常に優れていますが、情報を広める行為者が忘れるのは、「論理」に裏打ちされたアイデア/情報は、それらを送るもののコンテキストを持っているということです。情報も役立ちます。あなたにとって理にかなっていることは他の人にとって意味があり、彼らはそれを愛しますが、情報は絶対的なものとみなされるべきではありません。独自のコンテキストが一致するかどうかを確認します。それは、億万長者が私たちにこれらの「前進するための知識のビット」を与えているのと同じです。

要するに、理解しやすいコードを作成し、いくつかの人が言うほど多くのパターン/クラスと精錬所が必要な場合でも、まだ議論の余地があることを理解してください。議論の両側には非常に賢い人がいます。それはあなたのチームのために合理的な方法で何でもするというアイデアを強化するだけです-重要ではない小さな詳細に固執しないでください、あなたはそれらを理解します後で、覚えておいてください、あなたはタイミングが最も重要なものである非常に競争の激しい世界に住んでいます:

スタートアップ成功のタイミング。

時間とリソースを意味のある貪欲な方法で割り当てます。


6か月後の編集を次に示します。

それは非常識な旅でした。基本的に、分離/適切な命名とドキュメンテーションだけで、コードベースの内外に何でもプラグインできるとは思いませんでした。新しい変更に対応するために多くのコードを書き直さなければならず、2〜3日でかなりの時間を費やしました。知識不足やベストプラクティスがないため、どこでもSOLIDをフォローしていなかったと安全に言える。別々に名前を付けてドキュメントを作成すると、コードの変更をすぐに行うことができます。

誤解しないでください:密結合したコードを記述すると、SOLIDを嫌うかどうかにかかわらず、苦労することになります。基本レベルでそれを理解して適用することで、正直なところ、大きな分離が可能になりますOOPが本当に役立つ唯一のことです。OOPはコードの再利用についても想定されていましたが、それはあちこちで発生します、作成した多くのオブジェクトを実際に再利用することはできないため、システムが十分に分離されていることを確認してください。成熟に達して、ボブおじさんが来てあなたのプロジェクトをリードすると仮定して、彼は言う。 " (私は願います)。私にとっては、うまくいきます。私のLOCは絶えず変化しますが、執筆時点では1万行のコードであり、1人の人にとって調和して機能するコードは110万行です。


ここに、3か月後の、リファクタリング中の8か月のコードの編集を示します。

それはすべて理にかなっています。何が起こっているのか、そして回路図/優れた命名とコメントのためになぜそれが機能するのかを完全に理解しているので、今私は概念的に概念を書き直し、新しいアイデアでコードを作り直すことができます。ネーミングについてはあまり気にしないコードを何年も前に書いたので、それを経験するのは苦痛です。私は今、私のコードを説明する次のステップがどうなるか考えています。


良い命名。最も重要なポイント。ほとんどの人にとって簡単であり、物事がとても簡単になります。
-gnasher729
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.