私はCSの学生で、数年間恥ずかしがり屋で1年のうち数か月間コーディングを行っていますが、「悪い」習慣と思われるものを開発したようです。それは悪い習慣です)。コードのコーディング/問題の解決を行っているとき、最初の実装は時間がかかり、非常に複雑であることがわかりました。言い換えれば、単に不要な多くの無関係なコード(変数、チェック)があります。最初の「ドラフト」を完了し、コードが実際に機能することを確認したら、コードを単純化して、理解を容易にし、冗長を減らします。
私がこれを行う理由は、タスクを完了するために何が必要かを予測するのに苦労し、存在してはならない、または必要とされない複雑さを過度に補正して作成することになるためだと思います。私のコーディングスタイルのこの面を改善する方法に関するヒントやアドバイス、または習慣が実際に悪いものであるかどうかについての入力は誰にもありますか?
私には良い習慣のように聞こえます。コーディングの最初のルールは、それを機能させることです。それが済んだら、コードをクリーンアップして、できれば、きちんと理解しやすく簡単なコードにします。
ただし、ソリューションの設計に多くの時間を費やしていて、存在する必要のないものを作成するのに多くの時間を費やしている場合は、多くのクラスを作成して少し進んだ場合のように、それはおそらく悪い習慣です。怒り狂ったしかし、あなたが「それを機能させる」ことを目指している限り、それは問題のようには聞こえません。
私の答えは少しトピックから外れているかもしれませんが、この方法は私にとってはうまくいきます。
プログラミングを開始する前に、問題を解決するためにどのような構造を必要とし、どのようなアルゴリズムを使用するかを考える必要があります。
多くの場合、そのソリューションはすでに存在しており、プロジェクト*に実装するだけで済みます。車輪を再発明しようとしないでください。何かが必要な場合は、誰かがすでにそれをより良くした可能性が常にあります。
一度そうすれば、あなたはgluingの部分(アルゴリズムと構造)を一緒に残すだけでよく、それは通常、問題全体を考えるよりも簡単です。
*そのため、ITにおいて教育は非常に重要です。知っているアルゴリズムや構造の種類が多ければ多いほど、プログラミング中に、「ああ、わかった、私はthisを使わなければならない。ああ、ここで私は使う必要がある- それ。」
その習慣はTDDの典型です。まずそれを実装してから、リファクタリングします。私はすべての開発者が彼の最初の試みで最良の方法を実装するとは限らないと思います。リファクタリング後もすべてが機能することを確認する単体テストがある限り、問題はありません。
事前にやりたいことを紙で練習すると、不要なコードが少なくなることがわかりました。時々私は紙の上にいくつかのドラフトを作ることになるので、それはまだ反復プロセスですが、あなたが考えた何かが良いアイデアであると勝つことを認識するためにコードを動作させるためのすべての方法を得る必要がないので、反復はより速くなる傾向があります結局動作しません。 (それは疑似コードほど詳細である必要はありません。単純な描画は非常に役立ちます。また、紙に魔法はありません。ホワイトボードもうまく機能します。)
コードのクリーンアップは良い習慣ですが、そもそもクリーンなコードを目指しています。事前に計画を立てていても、クリーンアップする必要がありますが、最初はそれほど混乱することはありません。
コードの作成と再作成は問題ではなく、絶対に必要な以上のコードを作成することでもありません。コードを書いてそれを捨てたり、リファクタリングしたりするたびに、実際にそれがおそらく学習に最適な方法です。コーディングタイプやタイピング時間を「最適」にしようとすることは、関係者全員にとって本当に有害です。
また、これらすべての「余分な」変数は、多くの場合良い考えです。最初にコードを理解するのに役立つ場合は、そこに残しておくことをお勧めします。 Terseコードは、それを可読にするための方法だと考えて、最小限のコードを書くという罠に陥らないでください。
コードの「削除」にあまり熱心になりすぎないことをお勧めします。絶対に不要な場合は確かですが、追加の関数と変数を作成することはかなり良いことになる傾向があります。解決策を理解した後でそれらを削除すると、コードを確認したすべての人(数ヶ月を含む)を傷つけるだけです。後で)。
ただし、コードをDRYに保つことは重要です。実際、これはすべてのソフトウェア開発において最も重要な原則であると私は考えていますが、コードがDRYになると、理解と設計に役立つものから冗長性をさらに減らすことは通常有害です。 。
最高のコーダーと平均的なコーダーは通常同じようなコードを持っていますが、違いはそれを実行するのにかかる時間です。時間をかけて計画を立て、コーディングを開始する前に問題を解決すると、最高のコーダーの1人になることができます。明らかに、すべての問題を予測することができないので、小さなことをうまく行わなければならず、それがかなり面倒になる可能性があるので、あなたがしていることはコードのリファクタリングと呼ばれます(これは良い習慣です)。最善の方法は、最初に紙面でアルゴリズムを解き、どのようにタスクを実行するかを理解することです。次に、コードを記述して機能させ、リファクタリングしてクリーンアップし、読みやすくして最適化します。解決/コーディング/デバッグにかかる時間を見てください。これらの3つのうち、デバッグにかかる時間は最も少なく、コーディングが少し多く、問題を解決するのに最も時間がかかります。お役に立てば幸いです。
私の意見では、この習慣に問題はありません。コードが長くなればなるほど、コーディングと問題解決のスキルが向上するため、「余分な」コードはすべて少なくなります。
私は今から約2年間、ジュニアソフトウェアエンジニアとして働いていますが、この種のアプローチを使用していますが、時間が経つにつれて、トリミングされたソリューション/アルゴリズムにまっすぐに向かうことが多くなりました。 。
テスト変数はまだ私にとって一般的なものですが、はるかに効率的に使用されます。
したがって、ここでは特に心配する必要はありません。できるだけクリーンな状態に保ち、コメントとリージョンをたくさん使用してください。
可能であれば、無関係なコードをマークしてみてください。変数チェックはassertionsのように記述できます。これにより、意味的な情報がコードに追加されます。これらのプロパティは満たす必要があります。アサーションは通常「リリースモード」で(言語/プラットフォームによって異なります)削除されるため、多くのアサーションを削除する必要はありませんが、プログラムの一部を変更するときにデバッグのヘルプとして機能できます。
同様に、コードのデバッグに使用する一時変数については、debug_
接頭辞またはそれに類似したものなので、目的をすぐに伝えることができます。プログラミングは反復的なプロセスであるため、実行することは完全に正常です。
注意すべき1つの点:アサーションは、コードを説明するコメントよりも優れている場合があります。それらを(賢く)使用してください!
冗長性は、ジュニアプログラマーにとって非常に一般的ですが、これらの冗長性を認識して削除しようとすると、より高度になります。
最初は常にリファクタリングするのが良い習慣のように聞こえるかもしれませんが、最初から多くのリファクタリングが必要な場合は、最初のコーディングパフォーマンスを改善する必要があることを意味します。
より頻繁にリファクタリングすることが重要です。リファクタリングを行う前に、実装が完了するまで待ってはいけません。機能が長すぎる場合は、新しい機能を作成してください。コードが反復的である場合は、それから関数を作成します。コーディングが終わった直後だけでなく、コーディングするときは常にリファクタリングを考えてください。
常にリファクタリングすることで、作成した内容を確認する必要があり、デバッグが容易になります。コードが最初から正しく機能しなくなることはよくあります。コードがごちゃごちゃしたように見えると、数日後に自分自身でロジックを忘れてしまう可能性があります。
「必要なものを予測する」のに苦労するのは、あなたの短い経験を考えると自然なことだと思います。プログラムの書き方を学んでいるところです。設計を学ぶには多くの試行錯誤が必要であり、それは無関係なコーディングを回避するために必要なスキルです。あなたは正しい道を進んでいるようです。
おそらく、すでに詳細なコメントを書いているかもしれませんが、そうでない場合は、小規模な設計のツールとしてコメントを使用してみてください。最初に説明を書いてみてください。 1行のコードをメソッドに書き込む前に、その説明を記述します。何をするか、どのパラメーターを取り、何を返すか、どのような副作用があるか、どのような例外をスローするかを記述します。コードを記述する前に、コメントを使用して実装の概要を説明することもできます。クラスやモジュールについても同じことが言えます。実際に詳細や実装に入る前に、それらを全体として説明してみてください。
このアプローチでは、コーディングの前に何かを設計する必要があります。それはまた、最初に構造について考えることにつながるかもしれません。
「より多くの作業を簡素化する」アプローチには大きな欠点があります。大きくて複雑な方法はテストが非常に困難です。そして、リファクタリングされたコードが同じ結果を生成することを文書化するテストが必要です。
したがって、懸念事項の分離についてできるだけ早く考える必要があります。そうしないと、非常に困難な単体テストと格闘することに多くの時間を費やしてしまうため、それを防ぐことができます。最初から小さなコードが必要です。私にとって、「単一責任原則」(SRP)を理解することは、この文脈では非常に重要でした。また、良識の注入はここで非常に大きな役割を果たします。
最初はこれを行うのは難しいですが(それでもまだ私には多くの時間があります)、経験を積むにつれて、コード内のパターンを特定し、それらのパターンを単純でテスト可能な構造に分解する方法を徐々に学習します。 。
通常のシーケンスは、「正しくしてからエレガントにしてから効率的にする」です。最初のステップでは、何が起こっているかを追跡できる限り、必要なだけコードが長くなる可能性があります。
コードの段階的な改良は継続的なプロセスであり、最高のプログラマーでさえ、そのことを言うことが知られています 彼らの最も生産的な日は、コードの1000行を削除したとき 。大きく複雑なコードを簡略化できないことができない場合は、心配する必要があります。