タグ付けされた質問 「readability」

読みやすさは、コードがどれだけ簡単に読み理解できるかを測定します。

14
多くの開発者がパフォーマンス、可読性、保守性が共存できないと考えるのはなぜですか?
この質問に答えながら、なぜ多くの開発者が優れた設計がパフォーマンスを考慮すべきではないと考えるのか疑問に思い始めました。なぜなら、そうすると読みやすさや保守性に影響するからです。 優れたデザインでは、執筆時にパフォーマンスも考慮され、優れたデザインの優秀な開発者は、可読性や保守性に悪影響を与えることなく効率的なプログラムを作成できると考えています。 極端な場合があることは承知していますが、なぜ多くの開発者が効率的なプログラム/設計が読みやすさや保守性の低下をもたらすと主張するのでしょうか?

6
ネストされたループはなぜ悪い習慣と見なされるのですか?
私の講師は、ネストされたループを処理するときに参照できるように、Javaでループに「ラベル付け」することが可能であると今日述べました。それで、私はそれについて知らなかったので機能を調べました、そして、この機能が説明された多くの場所に警告が続き、ネストされたループを思いとどまらせました。 どうしてか分からないの?それはコードの可読性に影響するからですか?それとももっと「技術的」なものですか?

9
while(true)and loop-breaking-アンチパターン?
次のコードを検討してください。 public void doSomething(int input) { while(true) { TransformInSomeWay(input); if(ProcessingComplete(input)) break; DoSomethingElseTo(input); } } このプロセスには、有限であるが入力依存のステップ数が含まれると仮定します。ループは、アルゴリズムの結果としてそれ自体で終了するように設計されており、無期限に実行するように設計されていません(外部イベントによってキャンセルされるまで)。ループを終了するかどうかを確認するテストは、論理的な一連のステップの途中で行われるため、現在、whileループ自体は意味のあるものをチェックしません。代わりに、チェックは概念アルゴリズム内の「適切な」場所で実行されます。 終了条件がループ構造によってチェックされないため、バグが発生しやすいため、これは悪いコードだと言われました。ループを終了する方法を理解することはより困難であり、将来の変更を考慮して誤ってブレーク条件がバイパスまたは省略される可能性があるため、バグを招く可能性があります。 これで、コードは次のように構成できます。 public void doSomething(int input) { TransformInSomeWay(input); while(!ProcessingComplete(input)) { DoSomethingElseTo(input); TransformInSomeWay(input); } } ただし、これはコード内のメソッドの呼び出しを複製し、DRYに違反します。TransformInSomeWay後で他のメソッドに置き換えられた場合、両方の呼び出しを見つけて変更する必要があります(2つの呼び出しがあるという事実は、より複雑なコードではあまり明らかではありません)。 次のように書くこともできます。 public void doSomething(int input) { var complete = false; while(!complete) { TransformInSomeWay(input); complete = ProcessingComplete(input); if(!complete) { DoSomethingElseTo(input); } …

16
シンプルさは常に可読性を向上させますか?
最近、私は会社のために一連のコーディング標準を開発していました。(私たちは会社の新しい言語に分岐する新しいチームです。) 最初のドラフトでは、コーディング標準の目的を、読みやすさ、保守性、信頼性、およびパフォーマンスの向上として設定しました。(書き込み可能性、移植性、コスト、以前の標準との互換性などを無視しました。) このドキュメントを書いているときの私の目標の1つは、コードのシンプルさのアイデアを推し進めることでした。アイデアは、1行につき1つの関数呼び出しまたは操作のみが必要であるというものでした。私の希望は、これにより読みやすさが向上することでした。以前の言語から引き継いだアイデアです。 ただし、このプッシュの背後にある仮定に疑問を投げかけました。 シンプルさは常に読みやすさを向上させますか? より単純なコードを記述すると読みやすさが低下する場合はありますか? それは明らかなはずですが、「シンプル」というのは「書くのが簡単」という意味ではなく、1行あたりの処理が少ないことを意味します。

4
マジックストリング/数字の使用[終了]
これはやや物議を醸すトピックであり、プログラマーと同じくらい多くの意見があると思います。しかし、そのために、ビジネス(または職場)での一般的な慣行を教えてください。 私の職場では、厳密なコーディングガイドラインがあります。その1つのセクションは、マジックストリング/マジックナンバー専用です。状態(C#の場合): コードでは、記号定数を定義する以外に、数値または文字列のリテラル値を使用しないでください。次のパターンを使用して、定数を定義します。 public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public const int MaxNumberOfWheels = 18; } 例外があります:値0、1、nullはほとんど常に安全に使用できます。多くの場合、値2および-1も問題ありません。ロギングまたはトレースを目的とした文字列は、この規則から除外されます。リテラルは、意味が文脈から明らかであり、将来の変更の影響を受けない場合に許可されます。 mean = (a + b) / 2; // okay WaitMilliseconds(waitTimeInSeconds * 1000); // clear enough 理想的な状況は、次の場合にコードの可読性/保守性への影響を示す公式の研究論文です。 魔法の数字/文字列がいたるところにある 魔法の文字列/数字は、一定の宣言によって合理的に(またはさまざまな範囲で)置き換えられます-「合理的に」使用することについて私に怒鳴らないでください 魔法の文字列/数字は、過剰に置き換えられる必要があります(以下の私の例を参照) 私の同僚の1人と議論するときに科学的根拠に基づいた議論をするためにこれをしたいと思います。彼は次のような定数を宣言するようになります: private const char SemiColon = ';'; private …

5
返品後に作業を行うためのfinally節の使用は、スタイルが悪い/危険ですか?
イテレーターの作成の一環として、次のコードを作成していることに気付きました(エラー処理を削除) public T next() { try { return next; } finally { next = fetcher.fetchNext(next); } } 読むよりもやや読みやすい public T next() { T tmp = next; next = fetcher.fetchNext(next); return tmp; } 私はそれが読みやすさの違いがそれほど圧倒的ではないかもしれない単純な例であることを知っていますが、例外が含まれていないこのような場合にtry-finallyを使用するのが悪いかどうかについての一般的な意見に興味がありますコードを簡素化するときに実際に優先される場合。 悪い場合:なぜ?スタイル、パフォーマンス、落とし穴、...? 結論 あなたのすべての答えに感謝します!(少なくとも私にとって)結論は、最初の例は一般的なパターンであれば読みやすかったかもしれないが、そうではないということだと思います。そのため、目的外の構造を使用することで生じる混乱と、場合によっては難読化された例外フローが、単純化よりも重要になります。

12
人々はどのようにして非常に複雑で読みにくいコードをどのように書いて維持しますか?[閉まっている]
SQLiteのソースコードを読むことはIMOのミッションでは不可能です。ただし、他のコードからダウンロード、コンパイル、使用できる非常に複雑なソフトウェア(結局は本格的な組み込みデータベース)の使用可能な部分であり、常に更新されます。 このように非常に複雑で読みにくいコードを、どのように書いて維持するのでしょうか?

8
依存関係を他のプログラマーに非常に明白にすることを促進するプログラミングパラダイムはありますか?
私は、さまざまなアーティファクトをリンクする迷路のような依存関係を持つ多くのストリームとレイヤーを介して複数のシステムを調達するデータウェアハウスで働いています。ほぼ毎日、このような状況に陥ります。何かを実行しますが、機能しません。大量のコードを調べますが、数時間後には、今わかっていることのごく一部のプロセスマップを概念化することができました。後日必要になるので、誰かに尋ねて、この他のストリームを最初に実行する必要があることと、ここでチェックした場合(他のコード化された依存関係の巨大なスタックの一見arbitrary意的な部分を示す)、これを見た。とてもイライラします。 再帰的なレベルのコードや、さらにはデータにオブジェクトを深く埋め込むのではなく、オブジェクト間の依存関係をより明確に見えるようにするためにもっとや​​った方がいいだろうとチームに提案できた場合おそらく、よく知られ、試行され、テストされたソフトウェアパラダイムを参照することで、別のストリームが存在するために存在する必要があります。 私のチームにこの利点を説明するのはちょっと難しいです。彼らは物事をありのままに受け入れる傾向があり、システム全体を新しい方法で概念化できる利点を見るという点で「大きく考える」ことはしません。巨大なシステムをモデル化できるなら、効率的な場合、メモリの非効率性、ストリーム停止の一意の制約、重複キー、ナンセンスデータに遭遇する可能性が低くなります。元のビジョンに沿って設計する方がはるかに簡単で、後でこれらすべての問題に遭遇することはありません私たちは現在、過去の仕事では珍しいことを知っていますが、彼らは避けられないと考えているようです。 では、依存関係を強調し、理想の長期的な順守を確保するために、システムの一般的な概念モデルを促進するソフトウェアパラダイムを知っている人はいますか?現時点ではかなり混乱しており、すべてのスプリントは「こことこことここにこのものを追加するだけ」であるように見えます。

11
Postfix Increment演算子を避ける
パフォーマンス上の理由で(特定の場合に)後置インクリメント演算子を避けるべきだと読みました。 しかし、これはコードの可読性に影響しませんか?私の考えでは: for(int i = 0; i < 42; i++); /* i will never equal 42! */ より良く見える: for(int i = 0; i < 42; ++i); /* i will never equal 42! */ しかし、これはおそらく単なる習慣ではありません。確かに、私は多くの使用を見ていません++i。 この場合、パフォーマンスは可読性を犠牲にするのに悪いですか?または私はただ盲目であり、++iより読みやすいですi++か?

7
必須ではありませんが、オプションのパラメーター名を指定しますか?
次の方法を検討してください。 public List<Guid> ReturnEmployeeIds(bool includeManagement = false) { } そして、次の呼び出し: var ids = ReturnEmployeeIds(true); システムを初めて使用する開発者にとって、何trueが起こったのかを推測するのはかなり難しいでしょう。最初にやるべきことは、メソッド名にカーソルを合わせるか、定義に移動することです(どちらも少しでも大きなタスクではありません)。しかし、読みやすくするために、次のように書くのは理にかなっています。 var ids = ReturnEmployeeIds(includeManagement: true); コンパイラが必要としないときにオプションのパラメータを明示的に指定するかどうかを正式に議論している場所はどこにありますか? 次の記事では、特定のコーディング規則について説明しています。https://msdn.microsoft.com/en-gb/library/ff926074.aspx 上記の記事に似た何かが素晴らしいでしょう。

2
where条件とcontinueガード句を使用したforeachループのフィルタリング
私はこれを使用するプログラマを見てきました: foreach (var item in items) { if (item.Field != null) continue; if (item.State != ItemStates.Deleted) continue; // code } 私が通常使用する代わりに: foreach (var item in items.Where(i => i.Field != null && i.State != ItemStates.Deleted)) { // code } 私は両方の組み合わせを見てきました。「継続」、特により複雑な条件での読みやすさが本当に好きです。パフォーマンスに違いはありますか?データベースクエリを使用すると、あると想定しています。通常のリストはどうですか?

4
プラグインは何を使用すべきですか:フック、イベント、または何か?
プラグインがプログラムフローに反応できるようにするアプリを検討してください。 これを達成する2つの方法を知っています:フックとイベント 1.フック メインプログラムフロー内の空の関数の呼び出しを使用します。これらの機能はプラグインによってオーバーライドできます。 たとえば、Drupal CMSはモジュールとテーマで利用可能なフックを実装しています。file_copy関数でフックを実装する方法の例を次に示します。 function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) { // ... [File copying routine] // Inform modules that the file has been copied. module_invoke_all('file_copy', $file, $source); return $file; // ... } モジュールはmodulename_file_copy($file, $source)、module_invoke_allin によって呼び出される関数を実装できますfile_copy。この関数が終了すると、file_copy実行が再開されます。 2.イベント プラグインがリッスンできるイベントをアプリにディスパッチさせます。サブスクライブされているイベントを受信した後、プラグインはプログラムフローをインターセプトし、必要な操作を実行します。 たとえば、jQueryギャラリープラグインFotorama はいくつかのイベントを実装します。例として、イベントshowを発生させるメソッドの一部を次に示しfotorama:showます。 that.show = function (options) { …

2
同じことをする異なる関数シグネチャを提供することは良い考えですか?
以下は、3つの値で構成されるC ++クラスです。 class Foo{ //Constructor Foo(std::string, int, char); private: std::string foo; char bar; int baz; }; すべてのパラメータータイプは異なります。 順序が問題にならないように、コンストラクタをオーバーロードできます。 class Foo{ //Constructors Foo(std::string, char, int); Foo(std::string, int, char); Foo(char, int, std::string); Foo(char, std::string, int); Foo(int, std::string, char); Foo(int, char, std::string); private: std::string foo; char bar; int baz; }; しかし、それは良い考えですか? クラス/関数に必要なものがわかっていたので、それを始めました。 私はそれがそれらをどの順序で取ったかをいつも覚えていませんでした。 …

7
「var」およびヌル合体演算子「??」読みやすさを妨げることなく楽しまれる?
この質問は、Software Engineering Stack Exchangeで回答できるため、Code Review Stack Exchangeから移行されました。 8年前に移行され ました。 私は質問のタイトルが非常に主観的であることを知っていますが??、私は同僚によるオペレーターの使用に直面しましたvar。 ??演算子を使用するための引数は、コードの可読性を奪います。 私の質問は、使用を開始したときに同じことは起こりませんvarか?

12
内部構造がある場合、長い関数は受け入れられますか?
ネストされた関数(PythonやDなど)をサポートする言語で複雑なアルゴリズムを扱う場合、私はしばしば(アルゴリズムが複雑なため)巨大な関数を記述しますが、ネストされた関数を使用して複雑なコードを構成することでこれを緩和します。ネストされた関数を使用して内部的に適切に構造化されていても、巨大な(100行以上の)関数は依然として悪と見なされますか? 編集:PythonまたはDに精通していない人のために、これらの言語のネストされた関数は、外部関数スコープへのアクセスも許可します。Dでは、このアクセスにより、外部スコープ内の変数の突然変異が許可されます。Pythonでは、読み取りのみが許可されます。Dでは、宣言することにより、ネストされた関数の外部スコープへのアクセスを明示的に無効にできますstatic。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.