ソフトウェア工学

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

3
継承を使用してクラスをテストする正しいアプローチは何ですか?
私が以下の(過度に単純化された)クラス構造を持っていると仮定します: class Base { public: Base(int valueForFoo) : foo(valueForFoo) { }; virtual ~Base() = 0; int doThings() { return foo; }; int doOtherThings() { return 42; }; protected: int foo; } class BarDerived : public Base { public: BarDerived() : Base(12) { }; ~BarDerived() { }; int doBarThings() { return …

4
イベントを使用した分離コンポーネント間の通信
相互に作用する小さな(> 50)小さなWebComponentsがたくさんあるWebアプリがあります。 すべてを切り離しておくために、原則として、どのコンポーネントも別のコンポーネントを直接参照できないようにしています。代わりに、コンポーネントはイベントを発生させ、(「メイン」アプリ内で)配線されて、別のコンポーネントのメソッドを呼び出します。 時間が経つにつれ、追加されるコンポーネントが増え、「メイン」のアプリファイルには次のようなコードチャンクが散らばっています。 buttonsToolbar.addEventListener('request-toggle-contact-form-modal', () => { contactForm.toggle() }) buttonsToolbar.addEventListener('request-toggle-bug-reporter-modal', () => { bugReporter.toggle() }) // ... etc これを改善するために、同様の機能をグループ化し、にClass関連性のある名前を付け、インスタンス化するときに参加要素を渡し、内の「配線」を次のClassように処理します。 class Contact { constructor(contactForm, bugReporter, buttonsToolbar) { this.contactForm = contactForm this.bugReporterForm = bugReporterForm this.buttonsToolbar = buttonsToolbar this.buttonsToolbar .addEventListener('request-toggle-contact-form-modal', () => { this.toggleContactForm() }) this.buttonsToolbar .addEventListener('request-toggle-bug-reporter-modal', () => { this.toggleBugReporterForm() }) …

3
これらのユーザーコントロールが1回しか使用されない場合でも、ユーザーコントロールを使用してWPFフォームを構造化することは良い習慣ですか?
私はMVVMを使用してWPFアプリケーションを開発していて、最善の方法を学んでいます。 セレクター付きのWPFフォーム、検索フィールド付きの2つのリスト、およびその他の要素があります。現在、すべてが1つの形式になっており、機能します。しかし、今ではそのフォームのVMは800行を超えており、まだ完成していません。 このフォームとコードをよりよく構成したいと思います。リージョン、部分クラスを含むファイル、ユーザーコントロールについて考えました。ユーザーコントロールは、いくつかのコントロールとロジックをカプセル化しているため、最適だと思います。ユーザーコントロールを使用すると、そのウィンドウとVMのコード量が大幅に削減されます。 これを正しく行うために、「Pro WPF 4.5 In C#4th Edition」という本の第18章-カスタム要素とColorPickerUserControlサンプルに取り組みます。サンプルは、3つのスライダーを備えたカラーピッカーに関するもので、150行のコードが含まれています。 私はそれがどのように機能するか理解していると思いますが、そのサンプルのように機能が非常に制限されていても、ユーザーコントロールを作成するのは大変な作業だと思います。これらのコントロールを数回使用する場合、これを行うのが理にかなっていることを理解しています。しかし、コントロールを1回だけ使用し、これをフォームの構造化のみに使用する場合、これはほとんど利益を得るために多くの作業と思われます。 私の質問は次のとおりです。これらのユーザーコントロールが1回だけ使用される場合でも、ユーザーコントロールを使用してフォームを構造化することは良い習慣ですか?そうでない場合、より良い代替手段はありますか? 編集(読む必要はありませんが、詳細情報のみ):原則について学びたかったので、これまで詳細は書きませんでしたが、26の興味深い答えの17を読んだ後、ここにいくつかの詳細があります:このフォームは、音楽のタイトルを選択するためのものです。 グループA:(可能なユーザーコントロールA)は、アーティストまたはアルバムによる選択、ビデオの有無にかかわらず、おそらく発行年など、選択のタイプについてです。 グループB:このリストには、Aの基準に従ってフィルタリングされたアーティスト名が含まれています。ユーザーはリストをフィルタリングできます。つまり、「トップ」を含むアーティスト名のみを表示できます。 グループC:このリストには、Aの基準(オーディオまたはビデオ)を使用して、Bで選択したアーティストのタイトルが表示されます。Bと同様にフィルタリングできます。つまり、「あなた」を含むタイトルのみです。 ほとんどのロジックはVM(フォームのDataContext)で発生します。AとBのリストはデータベースからのものです。リストはフィルタリングされ、プレゼンテーション用に準備されます(つまり、同じ名前であるが異なるアルバムにある複数のタイトル)。ユーザーは、ダブルクリックしてCリストのタイトルを選択するか、別のWPFフォームにドラッグアンドドロップします。 必要なもの:簡単に修正できるように、読み取り可能なコードが必要です。別のフィルターを追加する場合、つまり女性アーティストのみを表示する場合は、ユーザーコントロールAに移動して、男性および/または女性アーティストのチェックボックスを追加するだけでよいとしましょう。 現在の形式のXAMLは問題なく、適切に構造化されています。ただし、VMには上記すべてのコードが含まれています。コンストラクター、コマンドセクション、プロパティ、バッキングフィールドにいくつかあります。私は今でも物事を見つけることができますが、コードがより構造化されていればもっと良いと思います。これがユーザーコントロールについて考える理由です。 MVVMの背後にあるロジックは非常に理にかなっていると思うので、MVVMをフォローしようとしています。しかし、私は理論的な実践の熱狂的な信者ではありません。つまり、VMで5行のCodeBehindまたは50行で何かを実行できる場合、CodeBehindで実行する可能性があります。私の質問は、WPFで構造化フォームを作成する方法の原則についてです。上記で説明したフォームは良い例ですが、答えはこの1つのフォームに集中するのではなく、WPFフォームを構成する方法、つまりユーザーコントロールを使用する(または使用しない)方法に集中する必要があります。 ユーザーコントロールが多くの作業を必要とする理由について:依存関係プロパティ、ルーティングイベントなどがあります。これはすべて、バッキングフィールドとINotifyを使用した「通常の」プロパティよりもはるかに複雑に思えます。しかし、依存関係プロパティ、ルーティングイベントなどに慣れる必要があるだけかもしれません。
8 c#  wpf  user-control 

2
「パラメータが多すぎる」のは視覚的な問題ですか、それとも論理的な問題ですか。
よると、機能が受け入れるべきか、多くのパラメータにそこガイドラインはありますか?、メソッドにパラメータが多すぎてはいけません。ただし、いくつかの回答は、この問題はビルダーパターンによって解決できることを示唆しています。 Builder b=new Builder(); b.setParm1("a"); b.setParm2("b"); . . . Obj obj=b.createObj(); または、単一のオブジェクトにパラメーターをカプセル化します。 ObjectParam op=new ObjectParam(); op.param1="a"; op.param2="b"; . . . obj.f(op); しかし、それが問題を解決するかどうかは疑わしいです。なぜなら、パラメーターをより適切な方法で(つまり:水平から垂直に)配置する方法だと思いますが、タスクがあまりにも多くのパラメーターに依存するという性質は変わりません。そして、パラメーターのチェーンをより見やすくしたい場合は、各パラメーターに次のような新しい行を使用できます。 https://softwareengineering.stackexchange.com/a/331680/248528 だから私の質問は、「パラメータが多すぎる」は視覚的な問題(コードの長い1行を読み取るのは難しい)ですか、それとも論理的な問題(タスクの性質はパラメータが多すぎるかによって異なり、分解する必要があります)ですか。それが視覚的な問題の詳細である場合、各パラメーターの新しい行で問題が解決されますか?

1
BSDライセンスのオープンソースプロジェクトを管理している場合、誰かがGPLライセンスのコードを不法に寄贈しないようにするにはどうすればよいですか?
BSD、MIT、または他の寛容なライセンスの下でライセンスされたオープンソースプロジェクトは、コミュニティからのコードの寄付を受け入れます。 自分が所有していないGPLライセンスのコードを誰かが取得してそれをBSDライセンスのプロジェクトに提出するのを防ぐにはどうすればよいですか?寄付がGPLライセンスのプロジェクトから盗まれたことを知りませんし、それを受け入れます。 プロジェクト全体をGPLにしないために、私はそのような貢献を受け入れたくありません。しかし、貢献者が貢献しているコードの著作権を実際に持っているかどうかを知る方法はありません。そのため、誰かがGPLライセンスのコードを私のプロジェクトに不法に寄付した場合、それらを止める方法はわかりません(寄付をまったく受け入れないことを除けば)。 確かに、BSDとMITでライセンスされたプロジェクトはたくさんあるので、解決策があるはずです。 ありがとう!

7
コードの正確さを証明できる場合、テストを作成する必要がありますか?
「TDDについて話すことはほとんど効果がありません。誰かにTDDを説得したい場合は、結果を示してください」と人々は言います。ただし、TDDがなくても、すでにすばらしい結果が得られています。TDDを使用する人が良い結果を得ることが納得できないことを私に示すと、TDDとTDD以外の両方を書く人がTDDでより良い結果を得ることができるようにしたいと思います。 これらすべてにもかかわらず、私はTDDを試してみたいと思っています。しかし、私はこれから何かを得るとは確信していません。それが有用であることが判明した場合、私はそれを私のチームの他のメンバーにプッシュしようとします。 私の主な質問は次のとおりです。コードの正確さを既に証明できる場合、TDDはコードに何らかの目的を果たしますか? 明らかに、どちらも特効薬ではありません。詳細を逃したために証拠が間違っている可能性があり、テストでは、テストに失敗したバグを特定できない可能性があります。結局、私たちは人間であり、誰もが100%バグのないコードを永遠に作ることはできません。私たちはできるだけ近づくように努力することができます。 しかし、TDDは、その正確性が証明されたコードの時間を実際に節約するでしょうか?つまり、コードが動作するステートマシンで、有効なすべての状態とその範囲が開発者によって認識され、すべてが考慮され、コードがすべての例外を渡すホワイトリストスタイルのエラーチェックで設計されているコード予期しないリークがないことを確認するための上位ハンドラー->(理由内の)関連メッセージをクライアントに表示することも、ログ通知を管理者に送信することもありません。 実際の例での回答の方が良いでしょう。 いくつかの説明: この質問は、コードの正当性を証明できるかどうかについてではありません。デフォルトでは、すべてのコードが妥当な時間枠内で正しいことが証明できるとは限らないが、一部のコードはそうであると想定します。たとえば、FizzBu​​zzモジュールの正当性を証明するのは非常に簡単です。クラウドベースのデータ同期サービスではそれほど簡単ではありません。 この制限内では、質問は次のように尋ねます。コードベースが2つの部分に分割されているという仮定から始めます。[I]正しいことが証明されている部分[II]正しく証明されていないが、手動で動作するようにテストされている部分。 今までTDDプラクティスがなかったこのコードベースにTDDプラクティスを適用したいと思います。質問は次のように質問します。TDDはすべての単一のモジュールに適用する必要がありますか、それとも、正しくないことが証明されたモジュールにのみ適用すれば十分でしょうか。 「実証済み」とは、このモジュールを完全に機能的なスタイルと見なすことができることを意味します。つまり、このモジュールは外部のグローバルまたは外部状態に依存せず、やり取りする他のモジュールが従う必要のあるI / O用の独自のAPIを完全に備えています。 。モジュールの外のコードを変更して「このモジュールを壊す」ことはできません。最悪の場合、コードを誤用して、フォーマットされたエラーメッセージを返す可能性があります。 明らかに、すべてのルールには例外があり、新しいコンパイラバージョンのコンパイラバグはこのモジュールにバグをもたらす可能性がありますが、同じバグがそれをテストしたテストに導入され、意図したとおりに機能しなくなったテストから誤った安全性をもたらす可能性があります。つまり、テストは魔法のようなソリューションではなく、保護の別のレイヤーであり、この質問は、この保護のレイヤーが、正しいことが証明されたモジュールの特定のケースで努力する価値があるかどうかの問題について説明します(それは確かに)でした。
8 tdd 

2
マイクロサービスアーキテクチャにおける多くのアプリケーションのAPIエンドポイントの維持と文書化
マイクロサービスを使用する上での最大の問題点の1つは、APIが十分に文書化され、APIがダウンストリームアプリケーションに影響を与えずに動作を変更しないことを確認することです。この問題は、相互に依存し合うサービスが多数ある場合に増幅されます。多分その時点であなたは間違ったマイクロサービスをやっていますが、私は余談です。 異なるチームが所有する20のマイクロサービスを継承していて、どのアプリケーションが他のどのアプリケーションのAPIエンドポイントを使用するかについての明確なドキュメントがないとします。これを文書化する規定された方法はありますか?最初に、各アプリケーションのエンドポイントを分析してデータベーステーブルに追加し、多対多テーブル(ほとんどすべてがRailsアプリケーションです)で各アプリケーションとアプリケーションのルート間にFK関係を作成することを考えました。しかし、これがこれを処理するための良い方法であるかどうか、または私はここで車輪を再発明しているかどうかわかりません。 振り返ってみると、マイクロサービスをゼロから始めている場合、これはアプリケーションの相互作用を文書化するのにそれほど悪くない方法かもしれません。これにより、データベースを使用して単一の信頼できる情報源が維持され、エンドポイントへの変更は、データベースの変更と連動してアプリケーションで実行されます。考え?

5
コードコメントにJIRAの問題を含めることは、一般的に役立ちますか?
たまにはこういうコメントをします # We only need to use the following for V4 of the computation. # See APIPROJ-14 for details. または # We only need to use the following for V4 of the computation. # See https://theboringcompany.atlassian.net/browse/DIGIT-827 for details. そうすることに関する私の主な懸念は、JIRAへの依存度が高まることです。そのため、別のプロジェクト管理システムに移行する場合、これらのコメントはまったく意味がありません。近い将来に発生することは予測できませんが、組織コンポーネント(この場合は、コード、コードリポジトリ、プロジェクト管理システム)の結合の増加に引き続き注意します。 ただし、コードベース全体で、文書化された設計の決定と機能のインスピレーションへの参照があることの利点はわかります。私の知る限り、メリットは 設計の決定への明確な道筋。これは、見慣れないコードの特定のセグメントのデバッグと強化に役立ちます。 複数行のコメントが少ないため、コードがよりクリーンになり、新しい貢献者を脅かすことが少なくなります。 (潜在的に)現在の技術的および非技術的利害関係者への明確な道筋 前述の理由により、「なぜここにあるのか」という質問の数は減少しています。

2
マイクロサービスアーキテクチャの他のサービスからのエラーメッセージの処理
当社は、数千のサービスを含むマイクロサービスアーキテクチャでアプリケーションを実行しています。50以上のサービスと通信するバックエンドアプリケーション「X」に取り組んでいます。フロントエンドサービスは他のサービスでリクエストを実行するためにサービス「X」を呼び出します。 問題点: フロントエンドは、他のサービスで何かが失敗したときに、ユーザーフレンドリーなメッセージを表示したいと考えています。 他のサービスはユーザーフレンドリーなメッセージを返しません。いくつかあるため、他のチームに変更を依頼することはできません。 そのような合意されたエラーコードはありません。他のサービスは文字列エラーメッセージを返します。現在、UIに渡されます。時々、エラーメッセージはポインタ参照です(悪いコード:/) 可能な解決策: エラーメッセージ文字列を確認し、サービスにユーザーフレンドリーなメッセージへのマッピングを含めます。ただし、呼び出し先のサービスがエラーメッセージを変更した場合は、問題が発生する可能性があります。カスタムエラーマッピングが見つからない場合のデフォルトのエラーメッセージへのフォールバック。 スケーラブルで持続可能なソリューションに関する他のアイデアはありますか?ありがとう!

7
「便利な使い捨て」スクリプトはどのように処理する必要がありますか?
あなたはそれがどのように行われるかを知っています:作業の95%を迅速に自動化する方法を見つけたいくつかの小さな反復的なタスクがあります。スクリプトを作成して実行し、出力を手動で修正すれば完了です。もちろん、スクリプトは会社の品質要件に適合しないため、コミットしません(ドキュメントもテストもないため)。 しばらくして、同じような作業をしている同僚がいます。あなたは「ねえ!そのためのスクリプトを作成しました。調べてみましょう。[見える]ああ、それは以前のラップトップに保管されていたので、もう持っていません。残念です。」 これらのスクリプトは多くの場合、多くの時間を節約することができ、チームのリーダーとして、バージョン管理に保存してほしいと思います。ただし、他のコードベースと同じ厳格な標準をこれらのスクリプトに課すと、ほとんどの開発者はそれらを自分たちに守ってくれると思います。 私が思い付くことができる他の唯一のオプションは、開発者がバージョン管理の特別な部分にスクリプトを保存できるようにすることです。バージョン管理の(GitHub Gistsのように)品質管理はありません。リスクは、他の人がコードを見つけたり理解したりできないためにコードを使用できないことです。 この問題はどのように解決できますか?それとも解決すべきではないのですか?

2
呼び出し元はHTTPリクエストによって呼び出されたコードの実行を中止できますか?
私が作成しているAPIにHTTPリクエストを行うサードパーティは、APIが1秒未満で応答することを要求しています。私の質問は、彼らが道持っているされて(文字通りあらゆるの範囲内で、道をHTTPおよび/またはTCP / IPプロトコル)それは長い1秒以上かかる場合は、私のコードの実行を中止するには?

6
エンジニアが突然利用できなくなった場合のソフトウェア災害復旧
私の会社では最近、締め切りが非常に厳しいプロジェクトがあり、極端な個人的な問題のために私が不在になるまで、すべてが計画どおりに進んでいました。 結局、4〜5日で締め切りに間に合いませんでした。 これらの状態の通常の回復計画は何ですか?私の会社は私の仕事を完了するために開発者を外部委託しようとする必要がありますか?それを見つけるのに数日かかるかも?

1
非決定論をHaskellの機能にする理由は何ですか?
私たちは中にいることを知っているプロローグ - 非決定論的述語がダウン削るために使用される機能です組合せの問題。 Haskell では、List Monadの Prolog と同様の非決定論的な動作が見られます。 Haskellでは、サンクの評価順序の選択に非決定性も見られます。 ただし、これらのサンクのどれを最初に評価するかをGHCに指示するものは何もないため、GHCは最初に評価するサンクを自由に選択できます。 これは魅力的です-そして多少解放されます。これが機能する原理は何でしょうか(8クイーンのようなロジックの問題を回避することは別として)。非決定論で解決しようとしていた大きなアイデアや大きな問題はありましたか? 私の質問は、非決定論をHaskellの機能にする理由は何ですか?

3
A / BテストとGitflowを処理するための戦略
アプリとgitflowのA / Bテストを処理するためにどのような戦略を使用していますか。 概要: 私たちは、大きなアプリを開発して維持する6人のプログラマーのチームです。これまでのところ、私たちはgitflowに取り組んでおり、数年前から完全にうまく機能していたプロセスにいくつかのアドオンを追加しました。簡単に言うと、次のように使用します。 マスターブランチ(公開バージョンのコードのみ) 最終的な冗長性テストの後にマスターにマージするリリースブランチ 極端な場合にのみmasterブランチと対話する修正プログラム 開発とモジュールの完成とテストが完了した時点で蓄積され、最終的にリリースにマージされます。 / featureは、開発から分岐し、それらが完了してテストのさまざまな段階を通過すると、機能を追加する開発にマージして戻る機能のグループです。 / fix_developは、以前のバージョンで発生したバグの修正を含む機能のグループであり、ホットフィックスを開始するのに緊急ではないものです。 アプリが進化するにつれ、UXチームや他の利害関係者チームとともに、新しいリリースに2つのバージョンがあり、ユーザーがいずれかのバージョンを好むかどうかに基づいて、より強力なA / Bテスト戦略を採用しています。ユーザーにとって意味のあるバージョンである必要があります。 それを説明したら、問題は次のとおりです。gitflow でA / Bテストバージョンのコードを管理するために、どのような戦略を使用または推奨しましたか? 私が検討したオプションは、どういうわけか一貫性がありません。たとえば、AブランチとBブランチをマスターからブランチしてから、リリースブランチをどちらかに結合します。リリースブランチに含まれるコードを機能に分離する方法を知りません。枝。別のオプションは、リリースAとBのブランチを作成し、AとBのブランチを開発することです。これは、ブランチが多すぎてチームメイトにとって混乱のように思えます。 あなたの意見を聞いて、ありがとう! 更新: 開発するアプリはAndroidアプリであり、A / Bテスト用にPlayStoreプラットフォームを使用してA / Bテストを実装しています。これには、2つのAPKを作成し、そのうちの1つをロールアウト%でアップロードする必要があります。また、物事をよりシンプルに保つため、またボタンの位置よりも変更が大きい場合があるため、1つのAPKにAおよびBテスト用の独自のスイッチを追加しないことにしました。

4
大きな関数を小さな関数にリファクタリングするときに追加の単体テストを作成することの価値は何ですか?
複雑な単体テスト機能がある場合: def do_everything(): # turn twizzles # push buttons # move mountain そして、それをいくつかの小さな単位にリファクタリングします: def do_everything(): turn_twizzles() push_buttons() move_mountain() def turn_twizzles(): # turn twizzles def push_buttons(): # push buttons def move_mountain(): # move mountain これらの小さなユニット用の追加の単体テストを書くのに時間を無駄にしていますか?

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