ソフトウェア工学

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

11
ソースコードを失うことはどれほど深刻ですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 ソフトウェア会社が販売している製品の1つにソースコードを紛失した場合、一般の人に説明できるとしたら、それはどれほど深刻なことでしょうか。「重大な過失」という言葉は強すぎますか?または「総無能」?明らかに誰も殺されなかったが、人々が刑務所の時間を過ごすためのいくつかの経済的過失ほど深刻ではないか? 編集: それは、ディスクドライブがクラッシュしたり、自然災害が発生したりするようなものではないとしましょう。彼らはそれを誤って置きました。

4
メソッドの名前を変更してもカプセル化を維持できますか?
ゲッター/セッターが正当化される時期についてこのページを読んでいましたが、OPは次のコードサンプルを提供しました。 class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void go_shopping(Fridge fridge) { fridge.set_cheese(fridge.get_cheese() + 5); } 受け入れ答えの状態: ちなみに、あなたの例ではFridge、putCheese()andのtakeCheese()代わりに、クラスに and メソッドを指定get_cheese() しset_cheese()ます。その後、まだカプセル化されています。 カプセル化は、名前をget / setからputCheese()/に変更することによってどのように保持さtakeCheese()れますか? 同じ答えでそれはまた述べています: ゲッターとセッターを使用しても、カプセル化が壊れることはありません。カプセル化を解除するのは、何も考えずに、すべてのデータメンバー(Java lingoのすべてのフィールド)にゲッターとセッターを自動的に追加することです。 この場合、変数は1つだけなのでcheese、チーズを取り出して冷蔵庫に戻したい場合があるため、この場合の取得/設定ペアは正当化されます。

7
エンドツーエンドおよび統合テストは、ミッションクリティカルではないものに価値がありますか?
エンドツーエンドのテストと統合テストはコストがかかることはよく知られています。もちろん、問題が発生した場合に人々が死ぬ可能性のあるアプリケーションを開発する場合、それは価値のある投資です。しかし、エラーが世界の終わりではないアプリケーションでは、E2Eテストと統合テストを完全にスキップして、何か問題が発生した場合に代わりにバックアップ計画を作成する方が安くないでしょうか。ユーザーストーリーの手動テスト+単体テスト+静的に型付けされた言語を十分に使用するようなものですか? たとえば、ウェブストアが注文を失った場合、代わりに無料でアイテムを送って+謝罪として別のアイテムを送ることができます。エンドユーザーはその方法でさらに幸せになる可能性があり、会社全体でコストを節約できます。 私の質問は、一般的に、統合テストとE2Eテストの費用と、それによって節約できる費用はどれくらいかと思います。これについてリスク/コスト計算を行う方法はありますか?
9 testing  qa  pricing  risk 

5
ベストプラクティス-関数呼び出しの周りをラップするvs関数内でガードする場合は早期終了を追加する
これは非常にユースケース固有のものになる可能性があることは知っていますが、私はあまりにも頻繁にこれに疑問を感じています。一般的に推奨される構文はありますか? 私は関数の中で最善の方法を尋ねているのではなく、早く終了するか、関数を呼び出さないかを尋ねています。 関数呼び出しの周りをラップする if (shouldThisRun) { runFunction(); } 持っている場合(ガード)機能で runFunction() { if (!shouldThisRun) return; } 後者のオプションは、この関数が複数回呼び出された場合にコードの重複を減らす可能性があることは明らかですが、関数の単一の責任性を失う可能性があるため、ここに追加すると間違っていると感じる場合があります。 例はこちら 何かのステータスを更新するupdateStatus()関数がある場合。ステータスが変更された場合にのみステータスを更新します。ステータスが変更される可能性があるコード内の場所を知っています。 私だけかどうかはわかりませんが、この関数をできるだけ純粋にしたいので、この内部関数をチェックするのは少し汚れています。これを呼び出すと、ステータスが更新されることが期待されます。しかし、変更を加えていない可能性があることがわかっているいくつかの場所で、呼び出しをチェックでラップする方がよいかどうかはわかりません。

5
抽象化が多すぎてコードの拡張が困難
コードベースの抽象化が多すぎる(または少なくともそれを処理している)と感じている問題に直面しています。コードベースのほとんどのメソッドは、コードベースの最上位の親Aを取り込むように抽象化されていますが、この親の子Bには、これらのメソッドの一部のロジックに影響を与える新しい属性があります。問題は、入力がAに抽象化されているため、これらのメソッドでこれらの属性をチェックできないことです。もちろん、Aにはこの属性がありません。Bを異なる方法で処理する新しいメソッドを作成しようとすると、コードの重複のために呼び出されます。私の技術リーダーによる提案は、ブール型パラメーターを受け取る共有メソッドを作成することですが、これの問題は、これを「隠された制御フロー」と見なす人がいることです。 、また、この共有メソッドは、小さな属性に分割されたとしても、将来の属性を追加する必要がある場合、一度複雑になりすぎたり複雑になったりします。これはまた、カップリングを増やし、結束を減らし、チームの誰かが指摘した単一責任の原則に違反します。 基本的に、このコードベースの抽象化の多くはコードの重複を減らすのに役立ちますが、メソッドの拡張/変更が最高の抽象化を行うようになっている場合は難しくなります。このような状況ではどうすればよいですか?私は非難の中心にいますが、他の誰もが彼らが良いと思うことに同意することはできませんが、それは結局私を傷つけています。

1
コメントの「TILT」とはどういう意味ですか?
私はRobert C. MartinのClean Codeを読んTILTでいますが、このフレーズは一部のコードサンプルに不可解に表示されています。例(ちなみにJavaです): ... public String errorMessage() { switch (status) { case ErrorCode.OK: // TILT - Should not get here. return ""; case ErrorCode.UNEXPECTED_ARGUMENT: return "Unexpected argument"; case ErrorCode.MISSING_ARGUMENT: return "Missing argument"; ... } ... コンテキストから、TILT到達できない状態であり、コンパイラを満たすためにのみ含まれている状態を指定していると思います(たとえば、上記のコードでは、状態がの場合はエラーメッセージが表示されないためTILT、ErrorCode.OKケースに表示されますOK)が、よく分かりません。 誰かがTILT/の意味が何であるか知っていますか?

9
チェスの駒の継承と構成
このstackexchangeを簡単に検索すると、一般的に構成は継承よりも柔軟であると一般に考えられていますが、常にプロジェクトなどに依存し、継承の方が適している場合があります。3Dチェスゲームを作りたいのですが、各ピースにはメッシュがあり、場合によっては異なるアニメーションなどがあります。この具体的な例では、両方のアプローチのケースが間違っていると主張できるように思われますか? 継承は次のようになります(適切なコンストラクターなどを使用) class BasePiece { virtual Squares GetValidMoveSquares() = 0; Mesh* mesh; // Other fields } class Pawn : public BasePiece { Squares GetValidMoveSquares() override; } これは確かに「is-a」の原則に従いますが、構成は次のようになります。 class MovementComponent { virtual Squares GetValidMoveSquares() = 0; } class PawnMovementComponent { Squares GetValidMoveSquares() override; } enum class Type { PAWN, BISHOP, //etc …

1
ソフトウェア構成管理(SCM)と呼ばれるのはなぜですか?
ソフトウェア構成について考えるとき、ランタイムによって読み取られるファイルについて考えます。このファイルには、サーバーが使用するポート、暗号化を使用するかどうか、さまざまなリソースのパスなどが含まれます。 最初に「ソフトウェア構成管理」に出くわしたとき、それは構成ファイルの管理だけを意味すると思っていましたが、SCMツールは構成ファイルだけでなく、ソフトウェアコード、ソフトウェア実行可能ファイル/バイナリ、およびリソースにも関係していることにすぐに気付きました。 では、なぜ「ソフトウェア構成管理」という用語を使用するのでしょうか。「ソフトウェア管理」はもっと包括的ではないでしょうか?それとも、「構成」と見なされるものについての私の理解は不足していますか?

3
コンピュータが数学演算で同じ結果を得るようにするには、固定小数点を使用する必要がありますか?
最近のほとんどのコンピューターは同じ浮動小数点標準に従っていると言われましたが、これは、入力が同じであれば、指定された数学演算ですべて同じ浮動小数点数の答えが得られるということですか? 私はネットワーク上でRTSゲームを作成することを研究していて、何百ものユニットの位置を同期するのは悪い方法のように聞こえるので、私は尋ねます。 したがって、入力のみを送信する場合、すべてのクライアントがこれらの入力からシミュレーションを実行することで同じ結果が得られることを保証する必要があります。 古いRTSゲームでは固定小数点演算が使用されていたと読みましたが、すべてが同じ標準に準拠している場合、現代のコンピューターでもそれが必要かどうかわかりません。また、不正確ではありますが、浮動小数点の結果は同じ入力に対して確定的であるとも言われました(これは、同じ標準に従うすべてのコンピューターが同じ不正確な結果を取得することを意味します)。 同じ浮動小数点の基準に従っても、コンピューターに偏差がありますか? 私はこのゲームをC#で書いていますが、それが重要かどうかはわかりません。

5
プログラムで任意のコードの安全性を評価することは可能ですか?
最近、安全なコードについて多くのことを考えています。スレッドセーフ。メモリセーフ。セグフォールトセーフで自分の顔を爆発させない。ただし、質問を明確にするために、Rustの安全モデルを定義として使用します。 多くの場合、Rustの必要性によって証明されているunsafeように、同時実行など、キーワードを使用しないとRustに実装できない非常に合理的なプログラミングのアイデアがいくつかあるため、安全性の確保はネットでの問題です。unsafe。並行処理が完全にロック、ミューテックス、チャンネルやメモリ分離して安全か何を持って行うことができますが、これは作業が必要です外での錆の安全モデルのをunsafe、その後、手動で、というコンパイラを保証する「うん、私は私がやっているか知っていますこれは安全ではないように見えますが、完全に安全であることを数学的に証明しました。」 しかし、通常、これは手動でこれらのモデルを作成し、定理証明を使用してそれらが安全であることを証明することになります。コンピュータサイエンスの観点(可能か)と実用性の観点(宇宙の生命を奪うことになるか)の両方から、任意の言語で任意のコードを受け取り、それがそうであるかどうかを評価するプログラムを想像するのは合理的です錆びない」 警告: この問題の簡単な解決策は、プログラムが停止しない可能性があるため、停止の問題が失敗することを指摘することです。読者に提供されたプログラムが停止することが保証されているとしましょう 「任意の言語の任意のコード」が目標ですが、これはプログラムが選択された言語に慣れていることに依存していることはもちろん承知しています。

4
リファクタリング-すべてのテストに合格する限り、単純にコードを書き直すことは適切ですか?
最近、RailsConf 2014の「All the Little Things」を視聴しました。この講演中に、Sandi Metzは、ネストされた大きなifステートメントを含む関数をリファクタリングします。 def tick if @name != 'Aged Brie' && @name != 'Backstage passes to a TAFKAL80ETC concert' if @quality > 0 if @name != 'Sulfuras, Hand of Ragnaros' @quality -= 1 end end else ... end ... end 最初のステップは、関数をいくつかの小さなものに分割することです: def tick case name when 'Aged …

3
関数型プログラミングで代入演算子またはループの使用が推奨されないのはなぜですか?
私の関数が2つの要件を満たしている場合、Sum リスト内の項目の合計を返す関数は、特定の条件に対して項目がtrueと評価され、純粋な関数と呼ばれる資格があると思いますか? 1)特定のi / pのセットに対して、関数が呼び出された時間に関係なく、同じo / pが返されます 2)副作用はありません public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){ int result = 0; foreach(var item in numbers) if(predicate(item)) result += item; return result; } 例: Sum(x=>x%2==0, new List<int> {1,2,3,4,5...100}); 私がこの質問をしている理由は、必須のプログラミングスタイルであるため、代入演算子とループを回避するようアドバイスしている人がほとんどいるためです。では、関数プログラミングのコンテキストでループと代入演算子を使用する上記の例で何が問題になるのでしょうか?

2
リポジトリパターンとDALオブジェクトの作成
私が学んだ限り、にはIRepositoryが含まれている必要がありますCRUD。その後、我々はこれを継承するIRepositoryような当社の他のインターフェイスにIProductして実装するIProduct具象クラスをProductRepository、などの方法でGetAllProducts()、Top5Products()。 n層アーキテクチャでも同じことができます。作成、のようにDAL Class Library、そこにクラスを定義するProductような方法でGetAllProducts()、Top5Products()。 両方において、DAL.ProductそしてRepo.ProductRepository、我々は初期化したクラスDB ContextでEntity Framework、当社の関連データを照会します。 呼び出しは両方Repo.ProductRepositoryまたはDAL.Productメソッドから似ていますBLL これらの類似点を考慮して、私の質問はレポの利点は何ですか?私はn層アーキテクチャを使用して非常に簡単に同じことを行うことができます(Controller、BLL Class Library、DAL Class Library)。

6
懸念の分離について書いたとき、ダイクストラはコードのモジュール化を意図していましたか?
まず、私は1974年の「科学的思考の役割について」の抜粋エズガーW.ダイクストラの論文を読みました。 私にあなたに説明しようと思います、私の好みに何がすべてのインテリジェントな思考に特徴的です。それは、自分の一貫性を保つために、自分の主題の側面を分離して詳細に研究することをいとわないことです。常に、側面の1つだけで自分を占有していることを知っています。私たちはプログラムが正しい必要があることを知っており、その観点からのみそれを学ぶことができます。また、効率的である必要があることもわかっており、いわば、別の日にその効率を調査することができます。別の気分では、プログラムが望ましいかどうか、またそうである場合、なぜプログラムが望ましいかを自問することがあります。しかし、これらのさまざまな側面に同時に取り組むことによって何も得られません-逆に!-。それは私が時々「懸念の分離」と呼んだものであり、それは完全に可能ではないにしても、私の知る限り、思考を効果的に順序付けるために利用できる唯一の手法です。これは、「ある側面に注目する」という意味です。他の側面を無視することを意味するのではなく、この側面の観点から見れば、他の側面は無関係であることを正当化するだけです。それは1つと複数のトラックを同時に気にしています。 私は、コードをモジュール化することについて、現代の懸念の分離が語られているのを見ています。しかし、上記の引用を読んで、私はこれをあなたの心を一度に1つの特定のタスクに集中させ、他の側面に焦点を合わせないものとして理解します。これは、必ずしもコードをモジュール化されたチャンクに分離する必要があることを意味するわけではありません。 つまり、1つのファイルに、ビュー、リポジトリ、コントローラー、イベント処理、ファクトリーなどの概念がすべて1つのファイルにあるというコードが目の前にあるとします。 簡単な例として、データアクセスと表示(出力)を行うコードを次に示します。 $sql = "SELECT * FROM product WHERE id = " . db_input($id); $row = db_fetch_array(db_query($sql)); <option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? ' selected="selected"' : '' ?>>Version <?=$row['ver']?></option> モダンなオブジェクト指向を使用して、リポジトリパターンを使用して独自のファイルにデータアクセスを配置し、ビューコードを独自のファイルテンプレートに入れ、それらをまとめてコントローラー(またはアクションまたはリクエストハンドラー)を介して通信することができます。ファクトリーを追加して、さまざまな依存関係を作成して接続します。そして、それらのファクトリーを定義する構成ファイルを持つことができます。確かに、それは単一ファイルのすべてから一歩離れています。 懸念の分離に関する私の質問は次のようなものです。ダイクストラの引用を読んで、おそらく彼が懸念の分離を必ずしも「コードのモジュール化(ファイルまたは独自の関数/メソッド/その他への)分離」であるとは限らないという考えを得ました。また、コードで物理的に分離されているかどうかに関係なく、他の重要であるが現時点では検討されていない側面に集中することなく、プログラムの側面に集中することを意味しました。 では、なぜ、物理的なモジュラーコードの分離と設計パターンに負担をかけているのでしょうか。コードがどのように構造化されているかに関係なく、アスペクトに専念するだけでは十分ではありませんか? 私は最も恐ろしいスパゲッティコードを書くことについて話しているのではなく、その側面のみを検討しているので、それはおそらく負担になります。しかし、結局のところ、私が目指しているのは、物理的なコード分離を実行する理由であり、側面に精神的に集中する必要がないのに、なぜコードを個別のファイルまたはチャンク(メソッド)に分割するのか、です。 懸念の分離は、肉体的ではなく精神的な運動のままである必要がありますか? 言い換えれば、プログラミングの精神的側面(焦点を当てる)と物理的側面(紙面上のコード)の間に断絶があるべきでしょうか?

2
JWTのペイロードにアクセス許可とロールを含める必要がありますか?
クライアントの権限と役割に関する情報をJWTに含める必要がありますか? JWTトークンにそのような情報があると、有効なトークンが来るたびに非常に役立つため、ユーザーに関する権限に関する情報を抽出するのが簡単になり、データベースを呼び出す必要もありません。しかし、そのような情報を含め、データベースで同じことをダブルチェックしないことは、セキュリティの問題でしょうか? または、 上記のような情報はJWTの一部ではなく、データベースのみを使用してユーザーのアクセスロールとアクセス許可を確認する必要がありますか?

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