ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

8
NoSQLがSQLより速いのはなぜですか?
最近、私は尋ねられました: NoSQLがSQLより速いのはなぜですか? 私は質問の前提に同意しませんでした...個人的にはそれはナンセンスです。SQLの代わりにNoSQLを使用しても、パフォーマンスが向上することはありません。たぶん、そうではありませんが、NoSQL上のSQLです。 NoSQLについて何か不足していますか?

6
不変式とは何ですか、どのように使用できますか?プログラムで使用したことがありますか?
私はCoders at Workを読んでいますが、その中には不変条件について多くの話があります。私が理解した限りでは、不変式とは式の前後両方に当てはまる条件です。Logicコースを正しく覚えていれば、ループが正しいことを証明するのに役立ちます。 私の説明は正しいですか、何か見落としていませんか?プログラムでそれらを使用したことがありますか?もしそうなら、彼らはどのように利益を得ましたか?
48 invariants 

6
メモ化された純粋な関数自体は純粋と見なされますか?
たとえばfn(x)、の素因数のリストを返すなど、高価な処理を行う純粋な関数だとしますx。 そして、と呼ばれる同じ関数のメモバージョンを作成するとしmemoizedFn(x)ます。特定の入力に対して常に同じ結果を返しますが、パフォーマンスを向上させるために以前の結果のプライベートキャッシュを維持します。 正式に言えば、memoizedFn(x)純粋と見なされますか? または、FPディスカッションでそのような関数を参照するために使用される他の名前または修飾用語はありますか?(つまり、後続の呼び出しの計算の複雑さに影響する可能性があるが、戻り値には影響しない可能性がある副作用を持つ関数。

8
関数名の引数の名前をより一般的にエンコードしないのはなぜですか?[閉まっている]
でクリーンなコードの作者は、例を示します assertExpectedEqualsActual(expected, actual) 対 assertEquals(expected, actual) 前者は、議論がどこに行くのか、それから生じる潜在的な誤用を覚える必要がなくなるため、より明確であると主張した。しかし、どのコードでも前者の命名スキームの例を見たことはなく、後者を常に見ています。著者が主張するように、後者が前者よりも明確であれば、なぜ前者を採用しないのですか?
47 clean-code 

9
コンストラクターのwhile(true)ループが実際に悪いのはなぜですか?
一般的な質問ではありますが、C ++のような言語はコンストラクターの実行、メモリ管理、未定義の動作などに関して異なるセマンティクスを持っていることを知っているので、私のスコープはむしろC#です。 誰かが私に興味深い質問をしましたが、それは私には簡単には答えられませんでした。 クラスのコンストラクターが終わりのないループ(つまり、ゲームループ)を開始できるようにするのは悪い設計と見なされるのはなぜですか(またはまったくそうではないのですか)。 これによって破られるいくつかの概念があります: 最小限の驚きの原則のように、ユーザーはコンストラクターがこのように動作することを期待していません。 ユニットテストは、このクラスを作成したり、ループを終了しないため挿入したりできないため、より困難です。 ループの終わり(ゲームの終わり)は、概念的にはコンストラクターが終了する時間であり、これも奇妙です。 技術的には、このようなクラスにはコンストラクター以外のパブリックメンバーがありません。これにより、理解が難しくなります(特に実装が利用できない言語の場合) そして、技術的な問題があります: コンストラクターは実際には終了しないため、GCで何が起こるのでしょうか?このオブジェクトは既にGen 0ですか? このようなクラスから派生することは、不可能であるか、少なくとも非常に複雑です。これは、基本コンストラクターが決して返さないため そのようなアプローチでより明らかに悪いまたは不正な何かがありますか?
47 c#  architecture 

9
要素の納期を固定することは、「アジャイル」な作業方法ですか?
私たちは、上級管理職による新しいプロジェクトに機敏に取り組んでいくと言われ続けています。彼らはスタンドアップ、スプリント計画、回顧などをセットアップしました。しかし、彼らは今、私たちが各要素に対して日付を提供し、それぞれでデモされるもので再び日付を見せたいすべての仕事を詳述する計画を思いつきました。 1。この計画は、2017年第2四半期に予定されています。 私にとってこれは最悪の意味でのウォーターフォールのように思えます。技術チームからの情報がない計画が作成されており、計画に関する特定のストーリーが非常に不明確であり、開発チームによって推定されていません。 しかし、私は彼らの議論が「シニアの利害関係者は日付を持たなければならず、計画が必要であり、単にバックログから作業することはできない」ことを知っています。私には、これは上級の利害関係者がアジャイルに買収していないようであり、したがって、私たちはそれをより低いレベルで実装することに失敗する運命にあります。 これは公平な判断ですか、それともこの計画に過剰に反応していますか?

12
「goto」ブードゥー教を避ける?
switchいくつかのケースを処理する構造があります。switch動作enumを組み合わせた値によって重複したコードの問題を提起しています: // All possible combinations of One - Eight. public enum ExampleEnum { One, Two, TwoOne, Three, ThreeOne, ThreeTwo, ThreeOneTwo, Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree, FourTwoThree, FourOneTwoThree // ETC. } 現在、switch構造は各値を個別に処理します。 // All possible combinations of One - Eight. switch (enumValue) { case One: DrawOne; break; case Two: DrawTwo; …

4
「まだ処理中」のHTTPステータスコード
最終的な処理のために長時間実行されるタスクをキューに入れることをサポートするRESTful APIを構築しています。 このAPIの一般的なワークフローは次のとおりです。 ユーザーがフォームに入力する クライアントがデータをAPIに投稿します APIは202 Acceptedを返します クライアントはユーザーをそのリクエストの一意のURLにリダイレクトします(/results/{request_id}) 〜最終的に〜 クライアントは再度URLにアクセスし、そのページで結果を確認します。 問題はステップ6にあります。ユーザーがページにアクセスするたびに、API(GET /api/results/{request_id})にリクエストを提出します。理想的には、タスクは今までに完了しており、タスクの結果と共に200 OKを返します。 しかし、ユーザーは強引であり、結果がまだ処理を完了していないときに、多くの熱心な更新が期待されます。 次のことを示すステータスコードの最良の選択肢は何ですか? このリクエストが存在する、 まだ終わっていない、 しかし、それも失敗していません。 単一のコードがすべてを通信することを期待していませんが、クライアントにコンテンツを期待させるのではなく、メタデータを渡すことができるものが欲しいのです。 202を返すことは理にかなっています。なぜなら、それはここでは他の意味を持たないからです。それはGET要求であるため、おそらく「受け入れられる」ものは何もありません。それは合理的な選択でしょうか? これらすべてに対する明白な代替手段-機能するが、ステータスコードの1つの目的を無効にする-は、常にメタデータを含めることです。 200 OK { status: "complete", data: { foo: "123" } } ...または... 200 OK { status: "pending" } 次に、クライアント側で、リクエストが完了したかどうかを判断するためswitchに(ため息をつきます)response.data.status。 これは私がやるべきことですか?または、より良い代替手段はありますか?これは私にとってWeb 1.0だと感じています。
47 rest  http 

4
可変型の「演算子」を持つ言語がそれほど多くないのはなぜですか?
私はそれをこのように意味します: <?php $number1 = 5; // (Type 'Int') $operator1 = +; // (Type non-existent 'Operator') $number2 = 5; // (Type 'Int') $operator2 = *; // (Type non-existent 'Operator') $number3 = 8; // (Type 'Int') $test = $number1 $operator1 $number2 $operator2 $number3; //5 + 5 * 8. var_dump($test); ?> しかし、この方法でも: <?php …

7
一貫したコードスタイルの実際の価値は何ですか
私は、顧客向けの新しいソリューションを実装するコンサルタントチームの一員です。クライアント側のコードベース(Reactおよびjavascript)のコードレビューの大部分を担当しています。 一部のチームメンバーが独自のコーディングパターンを使用して、スタイルだけで作者が誰であるかをランダムに選択できるようになっていることに気付きました。 例1(1回限りのインライン関数) React.createClass({ render: function () { var someFunc = function () { ... return someValue; }; return <div>{someFunc()}</div> } }); 著者は、someFuncに意味のある名前を割り当てることで、コードが読みやすくなると主張しています。関数をインライン化し、代わりにコメントを追加すると、同じ効果が得られると思います。 例2(非バインド関数) function renderSomePart(props, state) { return ( <div> <p>{props.myProp}</p> <p>{state.myState}</p> </div> ); } React.createClass({ render: function () { return <div>{renderSomePart(this.props, this.state)}</div>; } }); これは通常の方法です(状態と小道具を渡す必要がなくなります)。 React.createClass({ renderSomePart: function …

7
データベース列の複製に対して説得力を持って議論するにはどうすればよいですか?
私は新しい組織で働き始めました。データベースで見たパターンの1つは、ビジネスアナリストがクエリを記述しやすくするためにフィールドを複製することです。DjangoとそのORMを使用しています。 1つのケースでは、特定のコンテキストで患者を識別する一意の文字列を含むMedicalRecordNumberオブジェクトを保持します。我々は持っている登録患者を追跡および関連持つオブジェクトMedicalRecordNumbersをではなく、外部キー関係を使用するよりも、彼らが参加する書き込みを避けることができるように、彼らは文字列を複製(ないパフォーマンス上の理由のために)。このパターンは、データベース全体で共通です。 私にとって、データモデルがクリーンであることの重要性は、それについてよく考えることができるためです。不必要な複雑さは、限られた認知処理時間の無駄です。これは体系的な問題です。結合を書くのが気に入らないことは、修正可能なスキルの問題です。スキーマに戻って変更することを必ずしも支持する必要はありませんが、このタイプの複製に関する問題を説得力を持って明確に表現できるようになりたいです。

4
メソッドが複数のタイプのチェック済み例外をスローしないのはなぜですか?
SonarQubeを使用してJavaコードを分析しますが、このルール(クリティカルに設定)があります。 パブリックメソッドは最大で1つのチェック済み例外をスローする必要があります チェック例外を使用すると、メソッド呼び出し元はエラーを伝播または処理することでエラーを処理します。これにより、これらの例外はメソッドのAPIの一部になります。 呼び出し元の複雑さを合理的に保つために、メソッドは複数の種類のチェック済み例外をスローするべきではありません。」 ソナーの別のビットにはこれがあります: パブリックメソッドは最大で1つのチェック済み例外をスローする必要があります チェック例外を使用すると、メソッド呼び出し元はエラーを伝播または処理することでエラーを処理します。これにより、これらの例外はメソッドのAPIの一部になります。 呼び出し元の複雑さを合理的に保つために、メソッドは複数の種類のチェック済み例外をスローするべきではありません。 次のコード: public void delete() throws IOException, SQLException { // Non-Compliant /* ... */ } 以下にリファクタリングする必要があります。 public void delete() throws SomeApplicationLevelException { // Compliant /* ... */ } オーバーライドするメソッドはこのルールによってチェックされず、いくつかのチェックされた例外をスローできます。 例外処理に関する私の読書でこの規則/推奨事項に出くわしたことは一度もなく、このトピックに関する標準、議論などを見つけようとしました。私が見つけた唯一のことはCodeRachからのこれです:メソッドは最大でいくつの例外をスローする必要がありますか? これは広く受け入れられている標準ですか?

4
抽象構文ツリーはどのくらい正確に作成されますか?
私はASTの目標を理解しており、以前にツリー構造をいくつか構築したことがありますが、ASTを構築したことはないと思います。ノードはテキストであり番号ではないため、ほとんど混乱しています。そのため、コードを解析しているときにトークン/文字列を入力する良い方法は考えられません。 たとえば、ASTの図を見ると、変数とその値は等号のリーフノードでした。これは私にとって完全に理にかなっていますが、これをどのように実装しますか?私はケースバイケースでそれを行うことができると思うので、「=」につまずいたとき、ノードとしてそれを使用し、「=」の前に解析された値をリーフとして追加します。私はおそらく構文に応じて、たくさんの事柄のケースを作成しなければならないので、それは間違っているようです。 そして、私は別の問題に遭遇しました、ツリーはどのように横断されますか?高さを一番下に移動し、最下部に到達したらノードを上に移動し、隣のノードでも同じことをしますか? ASTで多数の図を見てきましたが、コードで簡単な例を見つけることができませんでした。おそらく役立つでしょう。

3
C#がインターフェイスのプロパティを許可するのはなぜですか?
C#では、次のコードが有効です interface I{ int property{get;set;} } これは私には意味がありません。これは、インターフェースの最も重要な原則の1つ、つまり状態の欠如(つまり、フィールドなし)を破っているようです。プロパティは暗黙のプライベートフィールドを作成しませんか?それはインターフェースにとって本当に悪いことではないでしょうか?

8
例外処理メカニズムなしで現代言語を設計する理由
多くの現代言語は豊富な例外処理機能を提供していますが、AppleのSwiftプログラミング言語は例外処理メカニズムを提供していません。 私は例外に悩まされていますが、これが何を意味するのかを頭で悩ませています。Swiftにはアサーションがあり、もちろん戻り値があります。しかし、私は例外に基づいた考え方が例外なく世界にどのようにマップされるのかを想像するのに苦労しています(そのため、そのような世界が望ましい理由)。Swiftのような言語ではできないことはありますか?例外をなくすことで何かを得られますか? たとえば、次のように表現するにはどうすればよいでしょうか try: operation_that_can_throw_ioerror() except IOError: handle_the_exception_somehow() else: # we don't want to catch the IOError if it's raised another_operation_that_can_throw_ioerror() finally: something_we_always_need_to_do() 例外処理のない言語(たとえば、Swift)で

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