ソフトウェア工学

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

7
ビジネスロジックでのデータベース値の参照
これはハードコーディングとベストプラクティスに関する別の質問だと思います。データベースに保存されている値のリストがあるとしましょう(テーブルはSSRSレポートなどの他の目的に使用されるため、データベースに存在する必要があります)。 1 Apple 2 Banana 3 Grapes それらをユーザーに提示し、ユーザーが1つ選択すると、FavouriteFruitとしてプロファイルに保存され、IDがデータベースのレコードに保存されます。 ビジネスルール/ドメインロジックに関しては、特定の値にロジックを割り当てるための推奨事項は何ですか。ユーザーがGrapesを選択した場合、追加のタスクを実行したい場合、Grapes値を参照する最良の方法は次のとおりです。 // Hard coded name if (user.FavouriteFruit.Name == "Grapes") // Hard coded ID if (user.FavoriteFruit.ID == 3) // Grapes // Duplicate the list of fruits in an enum if (user.FavouriteFruit.ID == (int)Fruits.Grapes) または、他の何か? もちろん、FavouriteFruitはアプリケーション全体で使用されるため、リストは追加または編集できます。 誰かが「ブドウ」の名前を「ブドウ」に変更したいと思うかもしれませんが、これはもちろんハードコードされた文字列オプションを壊します。 ハードコードされたIDは完全には明確ではありませんが、示されているように、コメントを追加するだけで、どのアイテムであるかをすばやく識別できます。 enumオプションには、データベースからのデータの複製が含まれますが、同期が取れなくなる可能性があるため、間違っているようです。 とにかく、コメントや提案を事前に感謝します。
43 design 

7
依存関係反転の原則を適用しない場合
現在、SOLIDを把握しようとしています。したがって、依存関係反転の原則は、任意の2つのクラスが直接ではなく、インターフェースを介して通信することを意味します。例:class Aメソッドがあり、typeのオブジェクトへのポインターを予期するclass B場合、このメソッドは実際にtypeのオブジェクトを予期する必要がありますabstract base class of B。これは、オープン/クローズにも役立ちます。 私が正しく理解していれば、私の質問は、これをすべてのクラスの相互作用に適用するのが良い習慣であるか、レイヤーの観点から考えてみるべきですか? 私が懐疑的である理由は、この原則に従うためにいくらかの代価を払っているからです。たとえば、featureを実装する必要がありますZ。分析後Z、機能はA、Bおよびで構成されていると結論付けCます。私が作成ファサードクラスはZ、それは、インタフェースを介して、クラスを使用していますA、BとC。私は実装をコーディングを開始し、いくつかの点で私は、そのタスクを実現するZ実際の機能で構成されA、BそしてD。次に、Cインターフェイス、Cクラスプロトタイプを破棄し、Dインターフェイスとクラスを個別に記述する必要があります。インターフェイスがなければ、クラスのみを置き換える必要があります。 つまり、何かを変更するには、1。呼び出し元2.インターフェイス3.宣言4.実装を変更する必要があります。Python直接結合実装では、実装のみを変更する必要があります。

2
Visual Studio Community Editionライセンスについて
最近、MicrosoftはVisual Studioの無料版をリリースしました:Visual Studio Community Edition ライセンスは言う これらのライセンス条項を順守する場合、以下の権利を有します。 インストールおよび使用権。 a。個別ライセンス。あなたがあなた自身のアプリケーションを販売または他の目的で使用している個人の場合、ソフトウェアを使用してそれらのアプリケーションを開発およびテストできます。 b。組織のライセンス。組織の場合、ユーザーは次のようにソフトウェアを使用できます。 ・任意の数のユーザーがこのソフトウェアを使用して、Open Source Institute(OSI)承認のオープンソースソフトウェアライセンスでリリースされたアプリケーションを開発およびテストできます。 ・任意の数のユーザーがソフトウェアを使用して、オンラインまたは直接の教室でのトレーニングと教育の一部として、または学術研究を実行するために、アプリケーションを開発およびテストできます。 ・上記のいずれにも該当せず、あなたも企業(以下で定義)でもない場合、最大5人の個々のユーザーがソフトウェアを同時に使用してアプリケーションを開発およびテストできます。 ・企業の場合、上記で許可されているオープンソースおよび教育目的を除き、従業員および請負業者はソフトウェアを使用してアプリケーションを開発またはテストすることはできません。「エンタープライズ」とは、(a)250台を超えるPCまたはユーザー、または(b)年間収益が100万米ドル(またはその他の通貨で同等)を集合的に有する組織およびその関連会社であり、「アフィリエイト」とは、 (過半数の所有権を介して)制御する、組織によって制御される、または組織と共通の制御下にあるエンティティ。 c。デモ用。上記で許可されている使用には、アプリケーションのデモでのソフトウェアの使用が含まれます。 d。バックアップコピー。ソフトウェアを再インストールするために、ソフトウェアのバックアップコピーを1つ作成できます。 「個人」として、「a」の条項に興味がありますが、それほど明確で明示的ではありません。私にとっては、幅広い使用法(オープンソース、フリーランスの仕事、あなたが所有していないアプリケーションへの貢献など)をカバーしていないため、少し制限されているように聞こえますが、混乱は文で使用されている用語「OWN」英語は私の母国語ではないので、全体を誤解しているかもしれません。では、文をどのように解釈しますか?ライセンスが明確にしない場合、ソフトウェアを使用できると想定できますか。たとえば、「b」の「Entreprises」のように「これまたはそのシナリオで使用することは許可されていません」。

3
(ほとんど)放棄されたGitHubプロジェクトに貢献するにはどうすればよいですか?
私は最近、GitHubでオープンソースのコラボレーションに取り組もうとしていますが、どのような方法で進めるのが好奇心situation盛かという状況に陥りました。 約1か月前、GitHubで、しばらく使用していて、いくつかのバグを見つけた(修正した)ライブラリのプロジェクトを見つけました。 GitHubコラボレーションへの最初の進出として、最近のアクティビティが最も多いと思われるレポを見つけ、1つのバグを修正し、ユニットテストを追加し、GitHubにプッシュし、プルリクエストを行いました。数時間以内に、私がフォークしたレポジトリのメンテナーは、PRを受け入れ、同様に待っていた他の人々からのいくつかの他のPRにマージしました。 これに拍車をかけ、発見したバグをさらに3つ修正しました。それぞれが自分のリポジトリの別々のブランチにあり、それぞれに問題とプルリクエストを提出しました。 それはほんの1か月前のことで、それ以降プル要求はそのままで、そのままになっています。リポジトリをフォークしたユーザーはあまりアクティブではないようです。過去1年間にGitHubで合計7回の投稿を行っただけで、最初のプルリクエスト以降、そのリポジトリにはコミットがありません。 だから私の質問: この状況でどのように進みますか?理想的には、親リポジトリにマージされていない自分のリポジトリに変更を加えて、ライブラリの断片化を回避したいと思います。それにもかかわらず、バグ修正と機能の追加を続けたいと思いますが、すべてをマスターブランチにマージし、そのブランチからすべての新しい修正をベースにした場合、フォークしたレポのメンテナーが戻ってきたら、勝ちました「すべての変更を機能/バグ修正ごとに個別のプル要求に分割することはできません(プル要求は通常、機能またはバグ修正ごとに1つのプル要求である必要があると読みました)。 元のレポと一致する1つのブランチを保持し、そのブランチの新しいブランチをすべてベースにしてから、すべてのコミットをマスターブランチにマージしたままにする必要がありますか?そのため、新しい変更をマスターブランチにマージする必要があるたびに、膨大な数のブランチとますます面倒なタスクが残ります。 このような状況にアプローチする典型的な方法は何ですか?プロジェクトは、新しいプルリクエストをレビューするためではなく、元の貢献者によって放棄されることになるのはかなり一般的なようです。これは、誰かが舵を取るだけでそれで走るべき状況ですか?元の貢献者が戻ってきて、再びプロジェクトに取り組みたいと思うと、断片化を引き起こすようです。


1
プログラマがパッケージ、名前空間、またはディレクトリ名として「Acme」を使用する理由[非公開]
これはばかげた質問かもしれないし、そうでないかもしれないが、私はしばらくの間私を悩ませてきた何かに対する答えを本当に知りたい。 私は、プログラマーがacmeものを入れるために呼ばれるディレクトリを作成したプログラミングの例/慣例をよく見ます。 どういうAcme意味ですか?EmcaなどではなくAcmeを使用する理由 Acmeは、雑多なOOPクラスをグループ化する一般的なフォルダー名のようなものですか? この用語は、プログラミング規則の観点からどこから来たのですか。私が見る限り、それはプログラマーUIとは何の関係もありませんhttp://plan9.bell-labs.com/sys/doc/acme.html

3
C#でエンタープライズプロジェクトのエラーコードパターンを作成するためのベストプラクティス[非公開]
私は多くのSMBや企業に展開されるエンタープライズプロジェクトに取り組んでいます。 このプロジェクトのサポートは苦労するため、エラーのコーディングパターン(HTTPステータスコードなど)を作成したいと思います。これにより、ヘルプデスクの担当者がドキュメントを参照し、できるだけ早く問題をトラブルシューティングできます。 これを行うためのベストプラクティスと推奨事項は何ですか? これを行うためのヘルプは役に立ちます。

5
MVCの衰退とは何ですか?[閉まっている]
数年前に実際にコードを整理し始めて以来、MVC / MV *を使用しています。私はそれを長い間使ってきたので、コードを構造化する他の方法を考えることすらできず、インターンになってからのすべての仕事はMVCベースでした。 私の質問は、MVCの没落は何ですか?どのような場合にMVCはプロジェクトにとって悪い選択であり、(より)正しい選択は何ですか?MVCの代替案を調べると、ほとんどすべての結果は異なるタイプのMVCにすぎません。 これが閉じられないように範囲を絞り込むには、Webアプリケーションの場合を考えてみましょう。私はさまざまなプロジェクトのバックエンドとフロントエンドで作業しているので、フロントエンドやバックエンドだけとは言えません。

7
チームが作成したクラスと機能をどのように追跡しますか?
コードで作業するとき、チームメートと同じ課題の多くに直面します。また、有用な関数とクラスをいくつか作成しました。良好なコミュニケーションがあれば、誰かがまとめた素晴らしいことを聞くことができます。6か月後に必要になったときにそれを覚えて、その関数を呼び出して時間を節約できます。覚えていない場合、またはまったく知らない場合は、おそらく車輪を再発明します。 これらの種類のものを文書化する特定の慣行はありますか?どのようにしてそれらを見つけやすくしますか? チームにそのようなドキュメントがない場合、ホイールがすでに存在するかどうかをどのように確認しますか? 編集: これまでのところ、答えの1つを除くすべてが理想的な状況を扱っているので、これらのソリューションを要約します。ドキュメントとコミュニケーション。wiki、スタンドアップミーティングなどはすべて素晴らしいものですが、ドキュメントを作成し、ミーティングに参加し、メモを取り、すべてを覚える時間(およびスキル)を持つプログラマーに依存しています。 これまでで最も人気のある回答(Calebの回答)は、文書化や会議ができないプログラマーが使用できる唯一の回答であり、プログラミングを1つだけ行います。プログラミングはプログラマーが行うことであり、もちろん、優れたプログラマーはドキュメント、ユニットテストなどを作成できますが、それに直面しましょう-私たちのほとんどはプログラミングよりもドキュメントを好みます。彼の解決策は、プログラマが再利用可能なコードを認識し、それを独自のクラスまたはリポジトリなどに引き出し、それが分離されているという事実によって、それが見つけやすくなり、それを使用するための学習曲線を容易にすることです... 。そして、これはプログラミングによって達成されました。 ある意味では、このように見えます。3つの関数を書いたばかりで、他の誰かがそれらについて知っておく必要があると思います。私はそれらを文書化し、書き、会議で発表することができます-私はできますが、それは私の強さではありません-または....私はそれらをクラスに抽出し、それをうまく命名し、それらをブラックボックス、および他のクラスファイルが行く場所に貼り付けます。その後、それを発表する短いメールは簡単です。他の開発者はコードをスキャンして、完全に理解していないコードで使用されている分離された関数よりもよく理解できます。そのコンテキストは削除されます。 これは、適切な名前のメソッドを備えた適切な名前のクラスファイルのセットを持つことは、優れたプログラミングによって達成される優れたソリューションであることを意味するため、これが気に入っています。会議を必要とせず、詳細な文書の必要性を和らげます。 この流れに他にもアイデアはありますか?

13
ストーリーポイントを平均より4〜5倍増やしていますが、バグの発生率は半分です。グラフによれば、それはさらに2倍のバグだという。
そのため、トップレベルのプログラマーは、平均的なピアよりも1 桁以上優れたコードを生成できると一般に受け入れられています。 また、プログラマーにとって、コードで発生するエラーの割合は比較的一定であることも一般的に受け入れられています。 代わりに、コードの作成時およびコードの作成後に使用されるプロセスの影響を受ける傾向があります。(私が理解しているように)人間はかなり一定の割合で間違いを犯す傾向があります-優れたプログラマーはそれらの多くに気づくだけで、より迅速に修正します。 上記の両方の主張は、Steve McConnellによるCode Completeからのものであることに注意してください。したがって、異なる観点の問題ではありません。 だから私は最近、私のコードでこれを見始めました。私は、(チームが推定したストーリーポイントで測定して)同程度のコードの約4〜5倍のコードを、より高い品質(パフォーマンスメトリックとチェックイン後に行われた変更の数に基づく)で打ち出すことができます。しかし、私はまだ間違いを犯します。優れた単体テストと、コードが何をしているのかをよりよく理解し、コードレビューを行う際の問題に対するより良い目との間で、4〜5倍の数のバグを生成していません。 しかし、QAが発見したバグは、チームの他の開発者の約2倍です。ご想像のとおり、これはメトリック測定を行う技術者以外の人々にいくつかの問題を引き起こします(私のボスを読んでください) 私は、ピアの半分の割合でバグを生成している(そして2倍修正している)ことを指摘しようとしましたが、2倍のバグを生成しているというグラフがあると、それは大変な売りです。 それでは、生産性の向上がバグの増加につながるという事実にどう対処するのでしょうか?

2
なぜ実存型は関数型プログラミングの悪い習慣と見なされているのですか(または、そうでないのですか)?
一貫してコードをリファクタリングして存在型への依存を排除​​するために使用できるテクニックは何ですか?通常、これらは、あなたのタイプの望ましくない構造を不適格にし、特定のタイプに関する最小限の知識で消費を許可するために使用されます(または私の理解もそうです)。 誰もがいくつかの利点を維持しているコードのこれらへの依存を削除するためのシンプルで一貫した方法を考え出しましたか?または、少なくとも、変更に対処するために重要なコードチャーンを必要とせずにそれらを削除できる抽象化をすり抜ける方法はありますか? 存在タイプの詳細については、こちらをご覧ください(「あえて」。)。

2
「リクエスト制限に達しました」の推奨HTTP RESTステータスコード
RESTサービスの仕様をまとめています。RESTサービスの一部には、サービス全体およびリソースのグループまたは個々のリソースでユーザーを調整する機能が組み込まれています。同様に、これらのタイムアウトは、リソース/グループ/サービスごとに構成できます。 HTTP 1.1仕様を調べて、クライアントが制限に達したために要求が満たされないことをクライアントに伝える方法を決定しようとしています。 最初は、クライアントコード403 - Forbiddenが1つであると考えましたが、これは仕様からです。 承認は役に立たず、リクエストは繰り返されるべきではありません 私を悩ませた。 実際に503 - Service Unavailableは、使用するほうが良いようです- Retry-Afterヘッダーを使用することで再試行時間の通信が可能になるためです。 将来的には、eコマースを介してより多くのリクエストを「購入」することをサポートする可能性があります(この場合、クライアントコード402 - Payment Requiredが確定されていればいいと思います!)。 私はどちらを使うべきだと思いますか?または、私が考慮していない別のものがありますか?

8
動的な無制限のサイズの「迷路」のデータ構造を構築するにはどうすればよいですか?
実際、「迷路」が正しい用語であるかどうかはわかりません。基本的に、ユーザーRoomは4つのドア(N、S、E、およびW)を持つシングルで開始します。彼らは任意の方向に行くことができ、後続の各部屋には、他の部屋に行く1〜4個の出入口がある別の部屋が含まれます。 「迷路」はサイズに制限がなく、部屋を移動するにつれて大きくなると考えられています。Rooms使用可能な数には制限がありますが、使用可能な数は動的であり、変更できます。 私の問題は、このタイプのパターンに最適なデータ構造がわからないことです 最初にRoomオブジェクトの[X] [X]配列を使用することを考えましたが、物事はどの方向にも成長するはずであり、「訪問された」部屋のみを構築する必要があるため、それを避けたいと思います。 もう1つの考えは、各RoomクラスRoomにN、S、E、Wの4つのリンクされたプロパティを含め、前のものRoomにリンクすることですが、それに関する問題は、ユーザーがその部屋に入るかどうかを特定する方法がわかりません隣接する部屋は既に「構築済み」です 例えば、 --- --- ---------- | | | | 開始5 4 | | | | --- --- --- --- --- --- ---------- --- --- | | | | | | | 1 2 3 | | | | | | --- --- --- --- ---------- …

7
FP以外の人が少量の関数型プログラミングを理解できるか?[閉まっている]
事例:私は会社で働いており、配列で大量のデータを処理するPythonでアプリケーションを作成しています。私は現時点でこのプログラムの唯一の開発者ですが、おそらく他のプログラマーによって将来(1〜3年)に使用/変更/拡張される可能性があります。私はおそらく直接その場にいませんが、時間があれば電子メールでサポートを提供するかもしれません。 そのため、関数型プログラミング(Haskell)を学んだ開発者として、たとえば次のようなフィルタリングを解決する傾向があります。 filtered = filter(lambda item: included(item.time, dur), measures) コードの残りの部分はオブジェクト指向です。私にとっては、はるかに単純で美しいため、このように解決したいのはほんの一部のケースです。 質問:今日このようなコードを書いても大丈夫ですか? FPを作成/学習していない開発者は、このようなコードにどのように反応しますか? 読みやすいですか? 変更可能ですか? 行が何をするのかを子供に説明するようなドキュメントを書くべきですか? # Filter out the items from measures for which included(item.time, dur) != True 上司に聞いたところ、「FPは黒魔術ですが、うまく機能し、最も効率的なソリューションであれば、使用しても構いません」と彼は言います。 これについてのあなたの意見は何ですか?非FPプログラマーとして、コードにどのように反応しますか?コードは「グーグル可能」であるため、その機能を理解できますか?これに関するフィードバックをお待ちしています。

22
識別子の空白は慣用的なものですか?[閉まっている]
C#スタイルでは、識別子でCamelCaseを使用して単語を区切ることを推奨しています。Lispの伝統は、代わりにダッシュを使用することを提案しています。 識別子にスペースを使用することが許可されているだけでなく、複数単語の識別子を使用するときに一般的に使用されるイディオムがあるプログラミング言語が存在したことはありますか? 一部のScheme実装では、スペース付きの識別子を使用することは可能ですが、広く見られる慣行ではありません。以下に例を示します。 Petite Chez Scheme Version 8.4 Copyright (c) 1985-2011 Cadence Research Systems > (define |hey there| 100) > (define |x y z| 200) > (list |hey there| |x y z|) (100 200)

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