ソフトウェア工学

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

1
C#で複合代入演算子をオーバーロードできないのはなぜですか?
タイトルは誤解を招く可能性があるため、質問全体をお読みください:-)。 「複合代入演算子」によってop=、たとえばこのような構造を念頭に置いてい+=ます。純粋な代入演算子(=)は私の質問に属していません。 「理由」とは、意見ではなく、デザイナー(またはその同僚)が推論(つまり、デザイン選択のソース)を表明する際のリソース(書籍、記事など)を意味します。 私はC ++とC#に見られる非対称性に困惑しています(はい、C#はC ++ 2.0ではないことを知っています)-C ++では演算子+=をオーバーロード+し、事前に定義された演算子に依存する適切な演算子をほぼ自動的に記述します C#では逆になります-オーバーロードし+、+=合成されます。 私が間違っていない場合、+=新しいオブジェクトを作成する必要があるため、実際の場合、後者のアプローチは最適化の機会を殺します。そのため、このようなアプローチには大きな利点がありますが、MSDNはあまりにも恥ずかしがり屋なので、それについて話すことはできません。 そして、その利点が何なのか疑問に思います-だから、C#の本、テクトークビデオ、ブログエントリで説明を見つけたら、参考に感謝します。 私が見つけた最も近いものは、Eric Lippertブログへのコメントです。C#でオーバーロードされた演算子が常に静的なのはなぜですか?トム・ブラウン。静的なオーバーロードが最初に決定された場合は、構造体に対してどの演算子をオーバーロードできるかを単に指定します。これにより、クラスで何をオーバーロードできるかがさらに決まります。

6
gitでは、ダースのライブラリのバージョニングを行う方法がすべて並行して動作しました
私たちはプロジェクトを行っていますが、プロジェクト間で多くのコードを再利用し、共通のコードを含むライブラリをたくさん持っています。新しいプロジェクトを実装するにつれて、一般的なコードを抽出してライブラリに追加する方法が増えています。ライブラリは互いに依存し、プロジェクトはライブラリに依存します。各プロジェクト、およびそのプロジェクトで使用されるすべてのライブラリは、参照しているすべてのライブラリの同じバージョンを使用する必要があります。ソフトウェアをリリースする場合、バグを修正する必要があり、長年、場合によっては数十年にわたって新しい機能を追加する必要があるかもしれません。約12のライブラリがあり、変更は多くの場合2つ以上にまたがり、複数のチームが複数のプロジェクトを並行して作業し、これらすべてのライブラリに同時に変更を加えます。 最近、gitに切り替えて、各ライブラリおよび各プロジェクトのリポジトリを設定しました。stashを共通のリポジトリとして使用し、機能ブランチで新しい作業を行い、プルリクエストを作成し、レビュー後にのみそれらをマージします。 プロジェクトで対処しなければならない問題の多くは、いくつかのライブラリとプロジェクト固有のコードを変更する必要があります。多くの場合、ライブラリインターフェイスの変更が含まれますが、その一部には互換性がありません。(これが怪しいと思うなら、私たちはハードウェアとインターフェイスし、特定のハードウェアを汎用インターフェイスの後ろに隠します。他のベンダーのハードウェアを統合するたびに、現在のインターフェイスが予期しなかったケースに遭遇するため、それらを改良する必要があります。)たとえば、プロジェクトを想像しP1たライブラリを使用してL1、L2とL3。L1また、使用していますL2とL3、とL2用途L3にも。依存関係グラフは次のようになります。 <-------L1<--+ P1 <----+ ^ | <-+ | | | | +--L2 | | ^ | | | | +-----L3---+ ここで、このプロジェクトの機能に変更が必要でP1ありL3、のインターフェースを変更することを想像してくださいL3。これらのライブラリを参照するプロジェクトP2をP3ミックスに追加します。それらをすべて新しいインターフェイスに切り替え、すべてのテストを実行し、新しいソフトウェアを展開する余裕はありません。それでは、代替手段は何ですか? 新しいインターフェースを実装する L3 プルリクエストをL3してレビューを待ちます 変更をマージする の新しいリリースを作成する L3 の新しいリリースをP1参照することで機能の作業を開始し、機能のブランチにL3機能を実装しますP1 プルリクエストを行い、これをレビューして、マージします (私はちょうど私がスイッチに忘れたことに気づいたL1とL2新しいリリースに。そしてそれはと並行して行われる必要があるので、私も、どこでこれを固執するかわかりませんP1...) これは、この機能を実装するための退屈でエラーが発生しやすい非常に長いプロセスであり、独立したレビューが必要であり(レビューがはるかに困難になります)、スケーリングがまったく行われず、私たちがビジネスを停止する可能性がありますプロセスが行き詰まってしまい、何もできなくなります。 しかし、あまり多くのオーバーヘッドなしで新しいプロジェクトに新しい機能を実装できるプロセスを作成するために、どのように分岐とタグ付けを使用するのでしょうか?

4
Pythonで部分的な日付をモデル化するにはどうすればよいですか?未知の年、または未知の月の日?
Bob was born in 2000やのような事実をキャプチャできるようにしたいですBill's birthday is May 7th。 両方の例で、私たちはその人の生年月日の一部のみを知っています。1つのケースでは、年のみを知っています。他の場合、月と日は知っていますが、年はわかりません。 この情報を取得するにはどうすればよいですか? これがどのように機能するかのいくつかの例: フィールドでNoneが未知を表すことを許可したdatetimeのようなライブラリを想像してください。次のようなコードがあります。 date_a = date(2000, 5, None) date_b = date(2000, 6, None) difference = date_b - date_a assert difference.min.days == 1 assert difference.max.days == 60 # Or something close to 60. assert equal(date_a, date_b) == False date_c = date(2000, …
11 python 

2
排他的コード権はどのように機能しますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 クライアントから、構築したいWebアプリの提案を提出するように依頼されました。このクライアントは、これまでのところ比較的良い牽引力を備えたスタートアップのようです(見たところ)。 私は彼らのために他の場所で書いたコードを書くことを防ぐ契約を起草するように頼まれました。ここまでは、ソースコードに対する排他的な権利を保持する契約を作成していましたが、クライアントもすべての権利(販売、変更など)を保持しています。 だから、これは私にはかなり奇妙に聞こえます: 似たような(まったく同じではない)プロジェクトを持つ別のクライアントがいて、彼が自分のアプリケーションを開発してほしいとしたらどうなりますか? もちろん、以前のプロジェクトからコピーして貼り付けることはしませんが、以前のプロジェクトで得た洞察のいずれも使用できず、このコードを再び書くことはできないと思われますすべてのクライアント向け。 したがって、質問は、ソースコードのすべての権利をクライアントに与えた場合、このコードを他人に書き換えることができないということですか? 注:私はここであなたのほとんどが弁護士ではないことを知っており、法的助言を探しているわけではありません。

2
有機化合物を表すためにどのデータ構造を使用しますか?
分子を表すために使用できる優れたデータ構造はありますか? すべての原子を頂点にすることでグラフとして表現できると考えていましたが、有機化合物には多くの炭素と水素が含まれているのが一般的です。どのように番号を付けますか?分子を表現する良い方法はありますが、同時に効率的な.contains()方法がありますか? これの最も基本的な用途の1つは、化合物にカルボニル基、ベンジル水素、またはベンゼン環が含まれているかどうかを確認することです。

2
MCUプログラミングにおけるRTOSとベアメタルの利点は?
注:この質問では、2つのRTOSについて具体的に言及していますが、より一般的であり、以前に組み込みRTOSのCコードを記述し、MCUでソフトウェアを直接実行したことがある人なら誰でも回答できます。 組み込みRTOSの詳細を学び、そのためのアプリケーションを作成することに興味があります。現在、EmboxとRIOTを検討しています。それらはオープンソースで、モダンで、アクティブで、優れたドキュメントがあるようです。私の目標は2つのフェーズです。フェーズ1は、これらのOSをコンパイルしてMCU(おそらくAVRまたはARM)にフラッシュする方法を見つけ出すことです。フェーズ2では、単純なCプログラム(基本的にはヘッドレスデーモン)を作成します。これは、「趣味アプリ」として時間とともに進化します。次に、このプログラムを同じMCUにフラッシュ/展開することで、Embox / RIOTとその上にあるアプリで構成されるアプリスタックを正常に展開します。 最終的に行き止まりに至る道を進む前に、C /アセンブラーで書かれMCUにフラッシュされたリアルタイムアプリがRTOSを実際に必要としない理由を説明するのに非常に役立つこの記事を偶然見つけました。 。 だから今、私は本当に混乱していて、コンピューティング理論の私の基本的な理解に疑問を抱いています。私は、最初にEmbox / RIOTを使用するかどうかの決定をしようとしていると思います。 コースを継続し、両方のOS +アプリのMCUで「アプリスタック」を使用します。または 記事の警告に注意し、MCUでアプリ「ベアメタル」を実行してください 明らかに、前者はより多くの作業であるため、そのルートに進むのに十分な理由/報酬が必要です。だから私は尋ねる:これらの(および同様の)組み込みRTOSがMCU / Cアプリ開発者に提供する本当の利点は何ですか?RTOSを使用することで、Cアプリはどのような特定の機能の恩恵を受けることができますか(おそらく、車輪を再発明しないことによって?)RTOSを捨ててベアメタルに移行すると何が失われますか? ここでは具体的な例を求めています。RTOSのウィキペディアエントリにアクセスしたときに得られるメディアの誇大広告ではありません;-)

2
個別の連鎖にバイナリ検索ツリーを使用してハッシュテーブルを高速化することは可能ですか?
バイナリ検索ツリーを使用してハッシュテーブルを実装し、O(n)(リンクリストを使用)からO(log n)(BSTを使用)への個別チェーンプロセスの検索の複雑さを軽減します。これを行うことはできますか?ソリューションが段階的なロジックの実装であれば、理解しやすくなります。 ハッシュテーブル(個別のチェーンを使用してビルド)の検索時間を短縮したいのですが、同時に挿入時間を増やしたくありません。私のプロジェクトでは、ハッシュ関数を変更して衝突を減らすことはできません。しかし、スケーラビリティのために、衝突が発生しています。私は回避策を見つけようとしていますので、衝突が発生した場合に何らかの方法で最高のアクセスと時間を挿入できるようにしています...つまり、アルゴリズム全体を再構築するよりも物の現在の状態を管理します。パンアウトしない場合は、再構築する必要があります。アイデアはありますか?

3
長期実行プログラムをプログラムで監視する方法
私が現在持っているものは、この擬似コードで要約することができます: public static void Main(string[] args) { var listOfObjects = Database.GetObjectsToUploadToOnlineService(); Parallel.ForEach(Upload) } private static void Upload(MyUploadObject obj) { //Build object (takes a few milliseconds) //Format to JSON (takes a few more milliseconds) //Upload (can take up to a max of 10 minutes) //Wait for a response (can take up …

2
コールグラフを描く
私はpythonで書かれた古いコードベースを維持しています。特に、モジュールから他の関数​​を呼び出す他のモジュールから他の関数​​を呼び出す複雑なコードがあります。OOPではなく、単なる関数とモジュールです。 メイン関数を呼び出すたびにフローの開始位置と終了位置を追跡しようとしましたが、サブコールで迷子になるため、これを描画する必要があると感じています。 私が心配しているのは、各関数が自分のタスクを完了し、呼び出し元に値を返すために、体内で複数の外部関数を呼び出すことです。 これをどうやって描くことができますか?この種の動作/コードを文書化するのに適切なチャート/グラフィックの種類は何ですか? したがって、UMLダイアグラムを作成するのに、フローチャートではなく、役に立つとは思いません。多分コールグラフ?

1
以前のコミットを修正する場合、別の修正コミットをリベースまたは追加する必要がありますか?
ソフトウェア開発の一般的なシナリオは、誰かのコードをレビューするコードです。これを行う一般的なツールは、プルリクエストを開くことです。 私の質問は、レビューで問題が見つかったときに、変更すべきかどうかです 個別にコミットする(新しいコミット) または、既存のコミットを変更する必要があります(以前のコミットから誰もブランチしていないと仮定します...共有ブランチからの履歴を書き換えることは悪いニュースです)。 最初のシナリオでは、コミット履歴にノイズを追加しますが、増分の変更を追跡するのは簡単です。2番目のオプションには、長所と短所が逆になっています。

1
開発スタックのスライス-対角線?
新しいプロジェクトが進行中です。現時点では、開発者はチームAとチームBの2つのチームに分かれています。このプロジェクトには、開発スタック全体での開発が必要な2つの部分があります。以下に示す非常に単純化されたスタックのサンプル: プロジェクトの各部分はスタック全体にわたる開発を必要とするため、通常はチームB内で作業を分解し、異なる部分間の相互作用を設計および実行するフルスタック開発者アプローチを期待します。 しかし最近、チームAがスタックの特定の部分を担当することを望んでいることを学びました。チームは、2つのチームの分割を提案しています。チームBからの開発はありません。分割は次のようになります。 私にはこれは非常に不自然に感じます。各チームには、これらを達成するための異なる明確な目標とタイムスケールがありますが、チームBは機能を実装するためにチームAに依存します。提案された解決策は、共通のインターフェイスが事前に定義されていることです(おそらくプロジェクトには2年のタイムスケールがあり、多数になる可能性があります)。チームAは、独自の目標を設定しているにもかかわらず、これらのインターフェイスに必要なビットを早期に開発し、チームBは、すぐに短期間のすべての呼び出しをスタブして、進行できるようにします。 私はこのアプローチについて懸念があります: インターフェイスは変更される可能性があり、チームAは変化する要件に対応するための帯域幅または時間がない場合があります。 チームAのコードのバグにより、チームBの進行が妨げられる可能性があります。また、チームAが異なる優先順位キューを持っているため、これらを修正する優先事項ではない可能性があります。 チーム全体に広がる知識の欠如-チームBは、内部で何が起こっているのかを完全に理解していない可能性があり、そのために設計上の決定が下される可能性があります。 業界の多くの企業にはサブチームがあり、これに対処できる必要があることが示唆されています。私の理解では、一般的に、チームは当初の予想方法(フルスタック)に分割されるか、以下のようにテクノロジースタックを分割します。 ですから、私は他の業界が何をしているかを知りたいと思っています。ほとんどの分割は垂直/水平ですか?対角線分割は意味がありますか?対角線の分割が発生した場合、私の懸念は有効であると思われ、チームBが懸念すべきことは他にありますか?私はおそらく、チームBの成功または失敗の責任を負うことに注意してください。

1
ASP.NET IdentityUserを他のエンティティから分離する
私が持っているProjectName.Coreすべての私のビジネスロジックと私のエンティティとその行動を含むライブラリを。現在、Entity Frameworkやその他のDALとはまったく関係がありません。これらのことを分離しておくのが好きだからです。Entity Framework構成(Fluent APIを使用)はProjectName.Infrastructureプロジェクトに常駐するため、エンティティをEFにプッシュできます。基本的には、オニオンのようなアーキテクチャの方向に向かっています。 ただし、ASP.NET Identityフレームワークをミックスに追加する場合、ApplicationUserエンティティをIdentityUserクラスから継承する必要がありますが、ApplicationUserクラスには他のエンティティとの関係があります。継承するIdentityUser際に、エンティティプロジェクトにエンティティフレームワークへの参照を導入しています。これは、そうしたくない1つの場所です。(Entity FrameworkベースのIDシステムを使用しているため)ApplicationUserエンティティプロジェクトからプロジェクトにクラスをプルするとInfrastructure、循環参照が発生するため、どちらにすることもできません。 これを回避する方法はありますか?ASP.NET Identityを使用しないことに加えて、2つの層の間のきれいな分離を保つことができますか?

3
デスクトップアプリケーションは、Webサービスの前にどのようにリモートサーバーと通信しましたか?
デスクトップアプリケーションにはあまり慣れていませんが、クライアントサーバーデスクトップアプリを作成する必要がある場合、データアクセスはWebサービスを介して行われます。Webサービスを介したデータアクセスはセキュリティを提供すると考えています。dbサーバーのユーザー名やパスワードなどを渡す必要はありません。 Webサービスの前、データベースアプリケーションはこれをどのように行っていましたか?すべての重要なdb情報がデスクトップアプリのインストールに渡されましたか?もしそうなら、プログラマはどのようにセキュリティの側面を管理しましたか?または、プログラマーはWebサービスに似たものを使用しましたか?

6
抽象マシンとコンピューターアーキテクチャ間のギャップを埋める?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 抽象マシン(Turingマシンなど)とコンピューターアーキテクチャ(仮想マシンのアーキテクチャ、Von Neumannのアーキテクチャを含む)の間には常に繋がりがありません。だから、私はそれらがどのように関係しているか知りたいですか?一方が他方にどのように影響しますか?参考文献も歓迎します。ありがとう。

2
「out」キーワードが2つの一見異なるコンテキストで使用されるのはなぜですか?
C#では、outキーワードは2つの異なる方法で使用できます。 引数が参照によって渡されるパラメーター修飾子として class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } } 共分散を指定する型パラメーター修飾子として。 // Covariant interface. interface ICovariant<out R> { } // Extending covariant interface. interface IExtCovariant<out R> : ICovariant<R> { } …

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