ソフトウェア工学

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

1
複雑な作業スケジュールのモデリング
私が表現して自動化しようとしている現実の問題があります。私はそれを次のように簡略化して抽象化しました: nの作業場所があります(P1、P2、...、Pn)。 各場所、Pnにはキー、Knがあります。 ワーカーがm人います(W1、W2、...、Wm)。 Pnで働くためには、労働者はKnを持たなければなりません。 各キーは、労働者が保持するか、取引所Eに残しておくことができます。 ワーカーはいつでもExchangeにアクセスして、要求されていないキーを取得したり、他のユーザーが使用できるようにいくつかのキーをドロップしたりできます。 現在、厳格な順序で完了する必要がある外因性の作業スケジュールがあります。例えば: 2016-04-21 W1はP6で働く必要があります 2016-04-21 W2はP3で働く必要があります **鍵の交換が必要です** 2016-04-22 W3はP3で働く必要があります 2016-04-22 W2はP6で働く必要があります 同じ日に決してではないが、スケジュールのある時点でPnで働く必要のある労働者はいくつもいる可能性がある 私たちは知っています: すべてのキーの開始場所(労働者またはEのいずれか) 各ワーカーが満たす必要がある将来の作業指示 それで、私はこの全体の状況をモデル化するのに苦労しています。データ構造とアルゴリズムを提案して、それを把握し、各ワーカーのエクスチェンジへのトリップの最適化を開始するために検討する必要がありますか? 私が最小限にしたいのは、Eへの旅行の総数です。2番目の目標は、労働者が不釣り合いな数の旅行をしないようにすることです。 前もって感謝します!!

5
戻り値型のオーバーロードが許可されないのはなぜですか?(少なくとも通常使用される言語)
すべてのプログラミング言語について知っているわけではありませんが、通常、戻り値の型(引数の数と型が同じであると想定)を考慮してメソッドをオーバーロードする可能性がサポートされていないことは明らかです。 私はこのようなものを意味します: int method1 (int num) { } long method1 (int num) { } プログラミングにとって大きな問題ではありませんが、場合によっては歓迎することもありました。 明らかに、どのメソッドが呼び出されているかを区別する方法なしにそれらの言語がそれをサポートする方法はありませんが、その構文は[int] method1(num)または[long] method1(num)のような単純なものにすることができますこれにより、コンパイラーは、どちらが呼び出されるかを認識します。 コンパイラがどのように機能するかはわかりませんが、それほど難しくはないように思われるので、なぜそのようなものが通常は実装されないのでしょうか。 そのようなものがサポートされない理由はどれですか?

2
依存関係の注入により、UIの膨大な数のインターフェイスを回避する方法
問題 私は最近、シングルトンが悪いことと、依存性注入(「インターフェースを使用する」と理解しています)がどのように優れているかについて、多くのことを読みました。コールバック/インターフェース/ DIを使用してこの一部を実装し、インターフェース分離の原則に準拠した場合、結局は混乱しました。 基本的にそのすべての子の依存関係を組み合わせたUI親の依存関係。したがって、UI要素が階層の上位にあるほど、そのコンストラクターは肥大化していました。 UI階層の最上位にあるのはApplicationクラスで、現在の選択に関する情報と、変更を反映する必要のある3Dモデルへの参照を保持していました。アプリケーションクラスは8つのインターフェイスを実装していましたが、これは製品(/インターフェイス)の5分の1に過ぎません。 私は現在、現在の選択を保持するシングルトンと、自分自身を更新する機能を持つUI要素を使用しています。この関数は、UIツリーとUI要素を細流化し、必要に応じて現在の選択シングルトンにアクセスします。コードはこのように私にはきれいに見えます。 質問 このプロジェクトにはシングルトンが適切でしょうか? そうでない場合、私の考えやDIの実装に根本的な欠陥があり、それが非常に煩雑になりますか? プロジェクトに関する追加情報 タイプ:ベルとホイッスル付きのアパートメントのショッピングバスケット サイズ:コードとUIに2か月/月 メンテナンス:実行中の更新はありませんが、後で「バージョン2.0」になる可能性があります 環境:エンティティを使用するUnityでC#を使用コンポーネントシステム ほとんどすべての場合、ユーザーの操作によっていくつかのアクションがトリガーされます。たとえば、ユーザーがアイテムを選択したとき そのアイテムとその説明を表示するUIパーツを更新する必要があります。このため、価格を計算するために、3Dモデルから情報を取得する必要もあります。 UIをさらに上に行くと、全体の合計価格を更新する必要があります 3dモデルのクラスの対応する関数を呼び出して、そこに変更を表示する必要があります

2
タイムラプス写真に最適な圧縮アルゴリズム
約9,000枚のJPEG写真(約30Gb)を含むフォルダを持っています。これを何らかの圧縮でアーカイブします。通常、JPEGの圧縮はあまり効果的ではないことを理解していますが、これらの写真はタイムラプスのフレームであるため、ほとんどの画像間に非常に多くの共通点があります。この場合、通常よりもファイルサイズが小さくなる可能性がありますか?このシナリオで特にうまくいく可能性が高い特定の(一般的な)圧縮アルゴリズムはありますか?

4
マイクロサービスと共有ライブラリ
独立したマイクロサービス(RabbitMqバスで接続)に基づくシステムを設計しています。コードは(少なくとも最初のコンポーネントでは)python(python2とpython3の両方)で記述されます。マイクロサービスとしてリファクタリングして拡張したいビジネスロジックの一部を実装したモノリスアプリケーションがすでにあります。私が心配する1つの質問は次のとおりです。 異なるマイクロサービス間でコードを共有する最良の方法は何ですか。いくつかのマイクロサービスで使用する必要がある共通のヘルパー関数(データ処理、ロギング、構成解析など)があります。 マイクロサービス自体は、個別のプロジェクト(gitリポジトリ)として開発されます。共通ライブラリは、自己完結型プロジェクトとしても開発できます。これらのライブラリをマイクロサービス間で共有するにはどうすればよいですか? 私はいくつかのアプローチを見ます: 各マイクロサービスに必要なライブラリのバージョンをコピーし、必要に応じて更新します 共通ライブラリを内部PyPiにリリースし、それらのライブラリをマイクロサービスの要件の依存関係としてリストします ライブラリリポジトリをgitサブモジュールとして含める 先に進む方法を決定する前に、提案されたアプローチ、ベストプラクティス、過去の経験についてもう少しお読みしたいと思います。提案やリンクはありますか?

2
重大なエラーではないREST APIの警告
DELETE、POST、またはPUTなどの一部のentpoindに対して、エラーを返す可能性のある検証ルールがあるREST APIを持っています。 クリティカルではないエラーのような新しいタイプのエラーが必要になりました。通常の方法でエラーが発生するはずですが、「警告の抑制」フラグが送信された場合はアクションに進む必要があります。このようなユーザーは、「このステータスを変更してもよろしいですか、まだ完了していません」と尋ねることができます。 質問:これらのタイプのエラーのベストプラクティスはありますか? 二次質問: 私が使用できるような動作のHTTPセマンティクスはありますか? 私はまだRESTのアイデアに従っていますか(私にとってはそうです)-私はそれをステートレスに保ちます
9 rest  api 


3
ASP.net 5とEF7でリポジトリはもう必要ですか?
EFチームにgithubで質問を投稿しました。ここでこの質問をする方がよいとの返信がありました。コピーしてここに貼り付け、リンクとして他のユーザーがGitHubでいくつかの返信を確認できるようにします。 質問:私はいくつかの調査を行っていましたが、誰かがDBContextクラスの24行目で次のように述べていると指摘しました DbContextは、作業単位パターンとリポジトリパターンの組み合わせです。 これは、EFをリポジトリーに抽象化し、インターフェースを使用してそれをコントローラーに注入する必要がなくなったことを意味しますか? Githubの元の投稿:https : //github.com/aspnet/EntityFramework/issues/4899 私がこれを尋ねる理由は、GetById、GetByName、GetWithIncludesABC、GetWithIncludes123などの多くのメソッドをリポジトリに追加しているように見えて、私の心の中でリポジトリを汚しているように思われるからです。

2
コードを再利用可能なビットに分割した後、どのようにテストしてデプロイしますか?
私たちは1人の開発者と、すべてのコードを含む1つのsvnリポジトリから始めました。 ^/foo/trunk/module-a ^/foo/trunk/module-b ^/foo/trunk/module-b/submodule-b1 ^/foo/trunk/website1 (当時、これは大きな改善でした)。これが少し成長する機会を得た後、循環依存、テストスイートの遅延、コードの再利用に関する一般的な問題が発生し始めました(たとえば、website1の機能セットが他の汎用モジュールaに侵入したため)。 コードベースをモジュール化して、まもなくgitに移動することを期待して(そしてgitがsvn mega-reposを好きではないところを読んだことを期待して)、もっと細かい構造に移行しました: ^/module-a/trunk/ ^/module-b/trunk/ ^/module-b/trunk/sumbmodule-b1 ^/earlier-sub-sub-sub-module-c/trunk etc. (about 120 such modules) これは概念的に素晴らしかった。モジュール化されたコードの増加、テストスイートの高速化、ドキュメント化の容易化など。より一般的なコンポーネントの一部をオープンソース化し、すべてのモジュールをpipインストールpip install -e .可能にしました(developmentvirtualenv にインストールするために使用)。 ^/srv/trunkランタイム環境のフォルダ構造を含むリポジトリを作成しました。^/srv/trunk/libモジュール、/srv/trunk/src残りの部分^/foo/trunk、^/srv/trunk/wwwウェブサイトなど そして最後に(非常に長い時間前に使用したperforceからのアイデア([ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html]))を作成し、「vcs-関連するすべてのリポジトリと、それらを開発環境にチェックアウトする場所と、それに対応するコマンドをリストしたテキストファイル。たとえば、vcs-fetc行: svn srv/lib/module-a ^/module-a/trunk いずれかを引き起こします(初回) cd /srv/lib && svn co ^/module-a/trunk module-a または(後で) cd /srv/lib/module-a && svn up そして同様にgithub repos(私たち自身と変更された/変更されていないベンダーパッケージの両方)についても同様です。 本番環境の作成には同じvcs-fetchプロセスを使用しましたが、vcs-fetchを実行した後、prodで実行されていたバージョンを知る方法がないことはすぐにわかります。 mega-repoを使用すると、トランクから製品を更新する前にリビジョン番号をメモするだけで済み、戻るのは簡単でしたsvn -r nnn up .。svnとgitの両方のコード(およびhgの1つのモジュール)と〜120リポジトリでは、これを行う方法は明らかではありません。 …

2
HaskellでEnumのサブクラスにバインドされないのはなぜですか
Boundedインスタンスには、Enumの適切な実装が必要なようです。私は反例を個人的に考えることはできませんが、誰かが病的でないものを思いついた場合、私はこれがそうでない理由を理解します。 :i2つのタイプクラスを実行することから、現在標準ライブラリにある唯一の例外はタプルの場合のようです。これは、バインドされているが列挙型ではありません。ただし、すべてのBoundedタプルは、最後の要素をインクリメントし、maxBoundに到達したときにラップすることによって、まともな方法でEnumerableにする必要もあります。 この変更には、Enum値をトラバースするための安全な/ループ方法のために、Boundedへの追加predBやnextBそのようなものが含まれる可能性があります。この場合toEnum 0 :: (...)、(toEnum 0, toEnum 0, ...) :: (...)

1
Node.jsの依存関係が重すぎる
最近、node.jsで遊んだ。 今、そこにあるすべてのノードのチュートリアルでは、 npm init そして、いくつかの標準的なサーバーフレームワークが必要だとすると、エクスプレスを選択するとします。 npm install express しかし、ASP.NETのような世界から慣れ親しんでいる多くのものが必要になります。 テンプレートエンジン(jade)とスタイルシートプリプロセッサ(SASS)について話します。 そして、彼らはあなたに「gulp / gruntをインストールしてください。そうすれば、サーバーを最小化、醜化して実行することができ、他の多くのものを自動的に実行できます!」 そして、それはgulp、node-sass、gulp-sass、gulp-uglify、そしておそらくもっとクールなもの(tsdまたはbabel、markdownなど)をインストールすることを意味します... しかし、それらすべては重いです、ディスクとプロジェクトます。同じことを問わず、すべてのノードモジュールが独自の依存関係を持っているため、10000以上のファイルは言うまでもなく、そのプロジェクト(まだ開始されていない!)の100 MB以上のディスクサイズで簡単に見つけることができます。依存関係は別のモジュールで使用されています。これは、Webサーバーはもちろんのこと、どこにでも移動するのが非常に困難です。 何か不足していますか?そのような明らかな欠陥が存在する間、ノード環境にそれほどの賞賛が与えられる可能性はないと思います。私が期待していることは多すぎます(結局、一度に多くのツールを使用しようとしたのですが)、ノードのベテランがこれを回避するために取るに足らないことはありますか?


2
オブザーバーパターンは、オブザーバーが互いに独立していない場合に適していますか?
私class Carは2つのプロパティを持つを持っています:int priceとboolean inStock。またList、abstract class State(空のクラス)も保持します。車に適用できる2つの状態があり、それぞれが独自のクラスで表されます:class Upgrade extends Stateおよびclass Shipping extends State。 A Carは、2つの状態をそれぞれいくつでも保持できます。州には次の規則があります。 Upgrade:1自動車自体に適用される各状態の価格に追加されます。 Shipping:Shippingリストに少なくとも1つの状態がある場合、inStockに設定されfalseます。 たとえば、始まるprice = 1とinStock = true: add Shipping s1 --> price: 1, inStock: false add Upgrade g1 --> price: 1, inStock: false add Shipping s2 --> price: 2, inStock: false add Shipping s3 --> price: …

1
継承と合成ではなく、いつ特性を使用するのですか?
OOPに関して再利用性を実装するには、AFAIKの3つの一般的な方法があります。 継承:通常はis-a関係(アヒルis-a鳥)を表す 構成:通常、関係があることを表す(車はエンジンがある) 特性(例:PHPの特性キーワード):...これについて本当にわからない トレイトはhas-aとis-aの両方の関係を実装できるように思えますが、どのようなモデリングが意図されていたのかはよくわかりません。どのような状況のために特性が設計されましたか?

8
スクラムの見積もりに対する交渉と打撃の試みは、プロセスの正当な部分ですか?
私はスクラムミーティングで、開発者がストーリーについて現実的な見積もりを行うことが多いことに気付きました。ただし、かなり単純なストーリーであっても、構成、サードパーティコンポーネントのセットアップ、テスト、最終ビルドに多大な労力が必要であり、システムにはかなりの技術的負債が蓄積されているため、製品の所有者や管理者にとって見積もりが高すぎることがよくあります。 POは次のような見積もりを頻繁に打ち消そうとします。たとえば、「このストーリーには13ストーリーポイント[4日間]が必要です。これは不可能です。これを経営者に説明することはできません。誰かがこれをコーディングできるはずです。 3 SP [4時間以内]で!」その結果、開発者は5または8ストーリーポイント(1.5〜2日)の見積もり(スクラムの見積もりは、単なる予測ではなく、コミットメントと見なされます)にコミットするために腕をひねります。 もちろん、(主にテストと品質に関する)期待を排除する計画がなければ、これらのスプリントは頻繁に失敗します。開発者の見積もりは正直で現実的なものであり、見積もりを打ち負かしても実際に行われる作業に影響が及ぶことはありません。 「誰かがあなたにそうするように強いたからといって、あなたは不可能な約束をするべきではありません!」しかし私の意見では、開発者の仕事はソフトウェアの設計とコーディングであり、交渉や圧力に対抗することではありません!すべての取引のジャックが存在する可能性がありますが、通常は外部の顧客と直接取引しますが、これはオフィス開発者の大多数ではありません! 私にとって、この実践は、プログラマーをぎくしゃくさせ、絶え間ないスプリントの失敗を引き起こし、現実的な見積もりを妨げるだけでなく、実際の改善点も探します。 スクラムガイドラインはこのトピックについて何を言っていますか、または彼らはそれに何を言っていますか? 編集:時間をストーリーポイントに置き換えました。私は、タスクの詳細計画ではなく、Planning Pokerとストーリーポイントを使用して最初の見積もりフェーズを参照していました。日/時をそこに置いたのは、このような典型的な対話であり、ポイントではなく時間も含まれていたためです。混乱してすみません!ストーリーポイントの例は、時間の例よりも長い期間を表しています。 編集2現在、専用のスクラムマスターはなく、POは見積もり会議に関してその役割を果たします。したがって、中立的なまたは開発者のスクラムマスターではなく、権威として表示されるため、おそらくロールコンフリクトがこの不適切な交渉を悪化させています。おそらく、これが何もない限り、彼を「マスター」ではなく偏った参加者とすることで修正できます。

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