ソフトウェア工学

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

3
ジェネリックと共通のインターフェース?
前回ジェネリッククラスを書いたときのことは覚えていません。何かを考えてから必要になると思うたびに、結論を出します。 この質問に対する2番目の答えは、明確化を求めることでした(まだコメントできないので、新しい質問をしました)。 ジェネリックが必要な場合の例として、与えられたコードを取り上げましょう。 public class Repository<T> where T : class, IBusinessOBject { T Get(int id) void Save(T obj); void Delete(T obj); } 型の制約があります: IBusinessObject 私の通常の考え方は次のとおりです。クラスはuse IBusinessObjectに制限されているため、これを使用するクラスもそうRepositoryです。リポジトリはこれらを保存します。IBusinessObjectほとんどの場合、これのクライアントはインターフェースをRepository介してオブジェクトを取得および使用したいと思うでしょうIBusinessObject。それではなぜ public class Repository { IBusinessOBject Get(int id) void Save(IBusinessOBject obj); void Delete(IBusinessOBject obj); } また、この例は、単なる別のコレクションタイプであり、ジェネリックコレクションはクラシックであるため、良くありません。この場合、型制約も奇妙に見えます。 実際、この例class Repository<T> where T : class, IBusinessbBjectはclass BusinessObjectRepository私によく似ています。これはジェネリックが修正するために作られたものです。 要点は、ジェネリックはコレクション以外のすべてに適しているので、クラス内でジェネリック型パラメーターの代わりにこの型制約を使用するように、型制約を特殊化することはありませんか?

5
ほぼ全員が共通のデータ構造にアクセスする必要がある場合の依存性注入の利点は何ですか?
OOPでグローバルが悪である理由はたくさんあります。 共有を必要とするオブジェクトの数またはサイズが大きすぎて関数パラメーターで効率的に渡されない場合、通常はグローバルオブジェクトではなく依存性注入をお勧めします。 しかし、ほとんどすべての人が特定のデータ構造について知る必要がある場合、なぜ依存性注入がグローバルオブジェクトよりも優れているのでしょうか? 例(特定のアプリケーションを深く掘り下げることなく、ポイントを一般的に示すための簡略化されたもの) 種類、名前、色、速度、位置など、膨大な数のプロパティと状態を持つ仮想車両が多数あります。多数のユーザーがそれらをリモートコントロールでき、膨大な数のイベント(両方ともユーザー、開始および自動)は、多くの状態またはプロパティを変更できます。 素朴な解決策は、それらのグローバルコンテナを作成することです。 vector<Vehicle> vehicles; どこからでもアクセスできます。 よりOOPに適したソリューションは、コンテナーをメインイベントループを処理するクラスのメンバーにし、コンストラクターでインスタンス化することです。それを必要とし、メインスレッドのメンバーであるすべてのクラスには、コンストラクターのポインターを介してコンテナーへのアクセスが許可されます。たとえば、外部メッセージがネットワーク接続を介して着信した場合、解析を処理するクラス(接続ごとに1つ)が引き継ぎ、パーサーはポインターまたは参照を介してコンテナーにアクセスできます。解析されたメッセージの結果、コンテナの要素が変更された場合、またはアクションを実行するためにそこからデータが必要な場合、信号やスロットを介して数千の変数を投げる必要なく処理できます(または、それらをパーサーに保存して、パーサーを呼び出した人が後で取得できるようにします)。もちろん、依存性注入を介してコンテナへのアクセスを受け取るすべてのクラスは、同じスレッドの一部です。異なるスレッドは直接アクセスしませんが、ジョブを実行してからメインスレッドに信号を送信すると、メインスレッドのスロットがコンテナを更新します。 ただし、クラスの大部分がコンテナにアクセスできるようになった場合、グローバルとはどう違うのでしょうか?非常に多くのクラスがコンテナ内のデータを必要とする場合、「依存性注入方法」は単なる偽装グローバルではありませんか? 答えの1つはスレッドセーフです。グローバルコンテナを乱用しないように注意を払っていますが、近い将来、他の開発者が近い締め切りの圧力の下で、すべてを気にせずに別のスレッドでグローバルコンテナを使用する可能性があります衝突の場合。ただし、依存性注入の場合でも、別のスレッドで実行されている誰かにポインターを与えると、同じ問題が発生する可能性があります。

1
API GatewayとESBの違いは?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 私が働いている会社は、Webサービスのガバナンス、計測、およびセキュリティのためのミドルウェアソリューションを評価しています。現在、この目的のためにEnterprise Service Bus(ESB)を使用していますが、経営陣の中には、API管理ミドルウェアをデプロイすることに決めた人もいます。 これらのAPI Management(別名API Gateway)ソリューションについて少し調査しましたが、それらと実際のESBの違いを見つけることができませんでした。Mule、WSO2、Oracleなどのホワイトペーパーを評価しましたが、両方の製品で提供される機能はほとんど同じようです。問題は、ESBができないAPI管理ができること、およびその逆です。API GatewayのESBを置き換えることにより、ITインフラストラクチャにどのような価値を追加できますか?

2
haskellで「ディメンションを型にベイク」することは可能ですか?
ベクトルと行列を扱うライブラリを書きたいとします。ディメンションを型にベイクして、互換性のないディメンションの操作がコンパイル時にエラーを生成することは可能ですか? たとえば、ドット積の署名を次のようにしたい dotprod :: Num a, VecDim d => Vector a d -> Vector a d -> a ここで、d型には単一の整数値(これらのベクターの次元を表す)が含まれます。 これは、各整数に対して個別の型を(手で)定義し、それらをで呼ばれる型クラスにグループ化することで実現できると思いますVecDim。そのような型を「生成」するメカニズムはありますか? または、おそらく同じことを達成するためのより良い/簡単な方法はありますか?

1
なぜ.NETフレームワークには、ファーストクラス型としてのクラスの概念がないのですか?
C#と.NETフレームワークは、Delphiの主任開発者であるAnders Hejlsbergによって設計された、本質的に「Javaのように書き換えられたDelphi」として始まったという歴史に詳しい人にはよく知られています。それ以来、物事はかなり分かれていますが、類似点の初期には非常に明白だったため、。 しかし、私は最近いくつかの.NETのものを見てきましたが、Delphiの最も興味深く有用な機能の1つは完全に欠落しているようです。それに慣れていない人のTClassために、Type型は.NET の型と同様に、クラスへの参照を表します。しかし、.NETがTypeリフレクションに使用する場合、DelphiはTClass言語の非常に重要な組み込み部分として使用します。クラスサブタイプ変数や仮想クラスメソッドなど、それなしでは存在しない、存在できないさまざまな便利なイディオムが可能になります。 すべてのOO言語には仮想メソッドがあり、異なるクラスがメソッドの同じ基本概念を異なる方法で実装し、その後、呼び出されたオブジェクトインスタンスの実際のタイプに基づいて実行時に適切なメソッドが呼び出されます。Delphiは、この概念をクラスに拡張します。特定のクラスサブタイプとして定義されたTClass参照がある場合(つまりclass of TMyClass、変数が継承する任意のクラス参照を受け入れることができますがTMyClass、階層スコープの外部ではない)それは、クラスの実際の型を使用して、インスタンスなしで呼び出すことができます。たとえば、このパターンをコンストラクターに適用すると、Factory実装が簡単になります。 .NETには同等のものはないようです。クラス参照(特に仮想コンストラクタや他の仮想クラスメソッド!)と同じくらい便利なのに、なぜそれらが取り残されたのかについて何か言いましたか? 具体例 フォームの逆シリアル化 Delphi VCLはDFM、コンポーネント階層を記述するためのDSL である形式でフォームを保存します。フォームリーダーがDFMデータを解析すると、次のように記述されているオブジェクト間で実行されます。 object Name: ClassName property = value property = value ... object SubObjectName: ClassName ... end end ここで興味深いのはそのClassName部分です。各コンポーネントクラスは、その時点でTClassコンポーネントストリーミングシステムに登録しinitializationます(静的コンストラクターは、わずかに異なるだけで、起動時に直ちに発生することが保証されています)。これにより、クラス名をキーとしてstring-> TClassハッシュマップに各クラスが登録されます。 各コンポーネントはから派生しTComponent、単一の引数をとる仮想コンストラクタを持ちますOwner: TComponent。どのコンポーネントもこのコンストラクタをオーバーライドして、独自の初期化を提供できます。DFMリーダーはクラス名を読み取ると、前述のハッシュマップで名前を検索し、対応するクラス参照を取得し(または、存在しない場合は例外を発生させます)、仮想TComponentコンストラクターを呼び出します。これは、登録関数がTComponentから派生するために必要なクラス参照を取得し、適切なタイプのオブジェクトが作成されるためです。 これがないと、WinFormsの同等物は...まあ...それを率直に言って大きな混乱であり、新しい.NET言語が独自のフォーム(デ)シリアル化を完全に再実装する必要があります。考えてみると、これは少し衝撃的です。CLRを持つことの全体的な目的は、複数の言語で同じ基本インフラストラクチャを使用できるようにすることなので、DFMスタイルのシステムは完全に理にかなっているでしょう。 拡張性 私が書いたイメージマネージャークラスには、データソース(イメージファイルへのパスなど)を提供し、コレクションにはないがデータソースでは使用可能な名前を取得しようとすると、新しいイメージオブジェクトを自動的に読み込みます。class ofベースイメージクラスとして型付けされたクラス変数があり、作成される新しいオブジェクトのクラスを表します。デフォルトが付属していますが、特別な目的で新しい画像を作成する場合、画像をさまざまな方法で設定する必要があるという点がいくつかあります。(アルファチャネルなしで作成する、PNGファイルから特殊なメタデータを取得してスプライトサイズを指定するなど) これは、大量の構成コードを記述し、新しいオブジェクトを作成する可能性のあるすべてのメソッドに特別なオプションを渡すことで実行できます...または、仮想メソッドをオーバーライドするベースイメージクラスのサブクラスを作成することもできます。問題のアスペクトが構成された後、try / finallyブロックを使用して、必要に応じて「デフォルトクラス」プロパティを一時的に置き換え、復元します。クラス参照変数を使用してこれを行うのははるかに簡単であり、代わりにジェネリックを使用して行うことはできません。

7
「SomeClass」や「SomeClassInfo」など、「Info」という接尾辞を持つクラスの命名の背後にある考え方は何ですか?
私は物理デバイスを扱うプロジェクトに取り組んでおり、このプロジェクトのいくつかのクラスに適切な名前を付ける方法として混乱しています。 実際のデバイス(センサーとレシーバー)を考慮することと、ソフトウェアでそれらを表現することは別のことであるため、「Info」という接尾辞の名前パターンでクラスに名前を付けることを考えています。 たとえば、a Sensorは実際のセンサーを表すクラスですが(実際に動作するデバイスに実際に接続されている場合)、SensorInfoそのようなセンサーの特性のみを表すために使用されます。たとえば、ファイルの保存時に、をシリアル化するのではSensorInfoなく、ファイルヘッダーにをシリアル化しますSensor。これは意味がありません。 しかし、今私は混乱しています。なぜなら、オブジェクトのライフサイクルには、どちらを使用するべきか、どのように別のものを取得するか、または両方のバリアントを実際に1つのクラスのみに折りたたむかどうかを判断できない中間点があるためです。 また、あまりにも一般的なEmployeeクラスの例は、明らかに実在の人物の表現にすぎませんがEmployeeInfo、私の知る限り、クラスに名前を付けることを提案する人はいません。 私が使用している言語は.NETです。この命名パターンは、これらのクラスの例として、フレームワーク全体で共通しているようです。 DirectoryおよびDirectoryInfoクラス; FileおよびFileInfoクラス; ConnectionInfoクラス(対応するConnectionクラスなし); DeviceInfoクラス(対応するDeviceクラスなし); だから私の質問は次のとおりです。この命名パターンを使用することについて共通の根拠がありますか?名前のペア(ThingとThingInfo)を使用するのが理にかなっている場合ThingInfoや、Thingクラスが存在しない、またはクラスが存在しない他の場合がありますか?

7
VBAからC#に移行するチームメンバーの質問
バックグラウンド 昨年、約10人のユーザーのビジネス計画に使用するツールの作成を依頼されました。これは、作業を「下請け」する別のITチームに代わって行われ、プロジェクトの締め切りが彼らの側で少し計画外であるため、私はそれを少し急いで実装しなければなりませんでした。 当時、私たちは、VBAを使用してExcelブックを作成し、ユーザーがこのVBAが強化されたブックをイントラネットからダウンロードしてPCで使用するのが最も簡単な方法であると判断しました。この場合、Excelは制約でした。使用する計画システム(データベース)は、計画ワークブックを開くと同時にロードする必要があるExcelアドインを介してのみ対話できるためです。ただし、当時のVBAは制約ではありませんでした。 約4,000行のVBAコードを作成したワークブックで、データレイヤーとプレゼンテーションレイヤーを分離しようとしましたが、プロジェクトの締め切りのためにすべてのケースでできませんでした。正直に言って、このワークブックを作成することを誇りに思っていますが、同時に、コーディングとユーザーへの展開の両方の面で、より良くできたという点で少しがっかりしています。 今日 今日に戻ると、ITチームが再び同じようなワークブックをリクエストするようになりました(したがって、上記の他のワークブックの一部を再利用できます)が、今回ははるかに複雑で、より多くのユーザーに使用されます(約200)。 ただし、今回は少し計画が良く、計画を立てる時間がもう少しあることがわかります。これに基づいて、100人のユーザー向けのプログラミングは10人のユーザー向けよりも影響が大きいため、ソリューションとインフラストラクチャについて考えました。したがって、既存のコードをC#ソリューションに移行して、コードをより洗練された方法で管理できるようにすることを検討することをチームに提案しました。VSTO / Excel-DNAを使用して作成され、ユーザーに展開できるアドインとしてまだ検討中です。 私はこれを2週間前にITチームと話し合い、すべてが順調であるように見えましたが、昨日まで、チームの1人(VBAまたはC#を知らない)から、この新しいプロジェクトをC#で開始するのではなく、前と同じアプローチ。彼らの懸念のいくつかは次のとおりです。 これはかなり重要なプロジェクトであるため、動作する必要があります。C#ソリューションは、既存のVBAベースのソリューションほど安定しておらず、動作しません。 VBAソリューションで行った[I]処理を破棄し、C#でゼロから再作成する必要があります。 誰かがVBAとC#の2つの別々のソリューションをサポートする必要があります。[実際、彼らは現在サポートのための誰かを持っていません、私は通常介入します]。 今、私は彼らの懸念のいくつかをある程度理解することができますが、次のステップと彼らに何を戻すべきかについて決定する必要があります。個人的には、C#で実装したいと思います。なぜなら、このような「エンタープライズ」ソリューションを構築する方が良いと思うからです。さらに、私はこの機会にC#のスキルを磨きたいと思います。私は現在C#の能力がVBAほどではないので、このようなプロジェクトを「次のレベル」に引き上げたいと思っています。 私は、C#ソリューションがこのプロジェクトに適していると確信させるために使用できるポイントのリストを用意しました。 単体テスト。 ソース管理。 コードのドキュメント-他のサポート担当者への知識の伝達。 コーディング規則の改善-ReSharperなどを使用して、命名と構造を強化できます。 IDEの改善-エラーの強調表示によるミスの減少。 アセンブリによるモジュール性の向上-将来のツールでの再利用を促進できます。 管理された展開-このツールの使用者を制御できます。 質問:説得するために他にどのような点を追加できますか?それとも、このプロジェクトで噛むことができる以上に噛み砕こうとしていますか?とにかく静かにしてVBAでやるべきですか? 「新しい」または「クールな」と思われるため、新しい言語に移行するだけでは判断の根拠にならないため、それを判断ポイントとして含めることを拒否しています。 また、私は言語としてのC#とVBAのリテラル比較を求めていません。SOには多くの比較があるからです。

2
コードを見るだけで、APIが何をしているのかを常に知る必要がありますか?
最近、私は自分のAPIを開発しており、そのAPI設計への投資に興味を持ち、API設計を改善する方法に強い関心を持っています。 数回登場した側面の1つは(私のAPIのユーザーによるものではなく、トピックに関する私の観察中の議論による)です。 たとえば、談話レポについてはGitHubでのこの議論を参照してください。 foo.update_pinned(true, true); (パラメータ名、ドキュメントなどを知らずに)コードを見るだけでは、何をしようとしているのか推測できません。2番目の引数はどういう意味ですか?推奨される改善策は、次のようなものにすることです。 foo.pin() foo.unpin() foo.pin_globally() そして、それは物事を明確にします(2番目の引数はfooをグローバルに固定するかどうかでした、私は推測しています)、この場合、後者は確かに改善されることに同意します。 ただし、コードを見ただけでは何をしているのかわからない場合でも、異なるが論理的に関連する状態を設定するメソッドが、個別のメソッド呼び出しではなく、1つのメソッド呼び出しとしてより適切に公開される場合があると思います。(したがって、パラメータ名とドキュメントを調べて調べる必要があります-個人的には、APIに不慣れな場合は常に何をしてもかまいません)。 たとえばSetVisibility(bool, string, bool)、FalconPeerで 1つのメソッドを公開し、次の行を確認するだけです。 falconPeer.SetVisibility(true, "aerw3", true); あなたはそれが何をしているのか分からないでしょう。falconPeer論理的な意味での「可視性」を制御する3つの異なる値を設定しています。パスワードのみで参加要求を受け入れ、検出要求に応答します。これを3つのメソッド呼び出しに分割すると、APIのユーザーは、「可視性」のすべての側面を設定するために1つのメソッドを公開するだけで他のユーザーに設定を忘れさせる「可視性」の側面を設定することになります。さらに、ユーザーが1つのアスペクトを変更する場合、ほとんどの場合、別のアスペクトを変更する必要があり、1回の呼び出しで変更できます。

6
整数のラップアラウンドを「元に戻す」
数年前に興味深い理論上の問題に遭遇しました。私は解決策を見つけたことがなく、寝るときも悩み続けます。 xと呼ばれるintに数値を保持する(C#)アプリケーションがあるとします。(xの値は固定されていません)。プログラムが実行されると、xに33が掛けられ、ファイルに書き込まれます。 基本的なソースコードは次のようになります。 int x = getSomeInt(); x = x * 33; file.WriteLine(x); // Writes x to the file in decimal format 数年後、Xの元の値が必要であることを発見します。一部の計算は簡単です。ファイル内の数値を33で除算するだけです。ただし、他の場合では、Xが十分に大きいため、乗算によって整数オーバーフローが発生します。ドキュメントによると、C#は数値が未満になるまで高位ビットを切り捨てint.MaxValueます。この場合、次のいずれかが可能ですか? X自体を回復するか Xの可能な値のリストを回復しますか? 単純な加算のケースが機能するため(基本的にXに10を加算してラップすると、10を減算してXで終了することができるので、一方または両方が可能になるはずです(私のロジックは確かに欠陥がある可能性があります) )そして、乗算は単純に繰り返される加算です。また、Xがすべての場合に同じ値-定数33で乗算されるという事実も役立ちます(私は信じています)。 これは何年も奇妙な瞬間に私の頭蓋骨の周りで踊っています。それは私に起こるでしょう、私はそれを熟考しようといくつかの時間を費やすでしょう、そして私はそれを数ヶ月間忘れます。この問題を追いかけるのはうんざりです!誰でも洞察を提供できますか? (サイドノート:私は本当にこれにタグを付ける方法を知りません。提案を歓迎します。) 編集: Xの可能な値のリストを取得できる場合、元の値に絞り込むのに役立つ他のテストがあることを明確にしましょう。
20 c# 

3
ステートフルシステムの単体テストの設計
バックグラウンド テスト駆動開発は、私がすでに学校を卒業した後、業界で普及しました。私はそれを学ぼうとしていますが、いくつかの大きな事柄がまだ私を逃れています。TDDの支持者は、次のような多くのことを言います(以降、「単一アサーション原則」またはSAPと呼びます)。 しばらくの間、TDDテストを可能な限りシンプルで表現力豊かでエレガントにする方法について考えてきました。この記事では、テストをできる限り単純かつ分解したものにすることについて、各テストで単一のアサーションを目指して少し探ります。 ソース:http : //www.artima.com/weblogs/viewpost.jsp?thread=35578 彼らはまた、このようなことを言います(以下「プライベートメソッドの原則」またはPMPと呼ばれます): 通常、プライベートメソッドを直接単体テストすることはありません。これらはプライベートなので、実装の詳細と考えてください。誰もそれらのいずれかを呼び出して、特定の方法で動作することを期待することはありません。 代わりに、パブリックインターフェイスをテストする必要があります。プライベートメソッドを呼び出すメソッドが期待どおりに機能している場合、拡張機能によってプライベートメソッドが正常に機能していると想定します。 ソース:プライベートメソッドを単体テストする方法 状況 ステートフルデータ処理システムをテストしようとしています。システムは、データを受け取る前の状態を考えると、まったく同じデータに対して異なることを行うことができます。システムに状態を​​構築し、特定のメソッドがテストすることを意図した動作をテストする簡単なテストを検討してください。 SAPは、「状態ビルドアッププロシージャ」をテストするべきではないことを提案します。状態はビルドアップコードから予想されるものであると想定し、テストしようとしている1つの状態変化をテストします。 PMPは、この「状態構築」ステップをスキップして、その機能を独立して制御するメソッドをテストすることはできないことを示唆しています。 私の実際のコードの結果は、肥大化し、複雑で、長く、書くのが難しいテストです。状態遷移が変更された場合、テストを変更する必要があります...これは、小さく効率的なテストでは問題ありませんが、これらの長い肥大したテストとは非常に時間がかかり、混乱を招きます。これは通常どのように行われますか?

11
同じオブジェクトへの2つの参照が必要になるのはいつですか?
特にJavaでは、他の言語でも同様です。同じオブジェクトへの2つの参照がいつ役立つのでしょうか。 例: Dog a = new Dog(); Dob b = a; これが役立つ状況はありますか?でa表されるオブジェクトとやり取りしたいときはいつでも、これが使用するのに好ましいソリューションになるのはなぜaですか?

7
ifステートメントまたはスイッチの長いチェーン以外に、これを行うためのよりインテリジェントな方法はありますか?
メッセージを受信するIRCボットを実装し、そのメッセージをチェックして、呼び出す関数を決定しています。これを行うより賢い方法はありますか?20個のコマンドが好きになった後、すぐに手に負えなくなるようです。 おそらくこれを抽象化するより良い方法がありますか? public void onMessage(String channel, String sender, String login, String hostname, String message){ if (message.equalsIgnoreCase(".np")){ // TODO: Use Last.fm API to find the now playing } else if (message.toLowerCase().startsWith(".register")) { cmd.registerLastNick(channel, sender, message); } else if (message.toLowerCase().startsWith("give us a countdown")) { cmd.countdown(channel, message); } else if (message.toLowerCase().startsWith("remember am routine")) …

4
プロのプログラマーではない、または決してプロではない人が、より読みやすく使いやすいコードを書くのを支援する[クローズ]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 私はエルビスであり、アインシュタインになることを一生懸命学ぼうとしています。私はモートで働いています。 このクレイジーなバカは何を言っているんだ!?!?(最初の数段落だけを読む必要があります) あなたがそのリンクを読む気にならないなら、基本的に、私はプロのプログラマーであり、私のボスはそうです(これは恐ろしく正確です): コンピューターサイエンスの学位はないが、OfficeとVBAに精通しており、通常は同僚の間で共有される生産性アプリケーションを記述するプロの基幹業務プログラマー とは言うものの、私の仕事の大部分は、彼の丸石で結ばれたコードを取得し、生産準備を整えることです。しかし、非常に貧弱なスタイルとカーゴカルティズムがこれを難しくしています。これは、彼がプログラミングの本を読むことを嫌がり、コードをリファクタリングするのを手伝ってくれるという事実によってさらに悪化します。 プロのプログラマーではない人を助けるための戦略は他にもありますか?プロのプログラマーが私にとって使いやすく解釈しやすいコードを今後書くことはありませんか?

10
私のチームは、リファクタリング後の頻繁なエラーをどのように回避できますか?
少し背景を説明すると、私は約12人のRuby on Rails開発者(+/-インターン)を抱える会社で働いています。リモートワークが一般的です。当社の製品は2つの部分で構成されています。かなり太いコア部分と、それに基づいて構築された大規模な顧客プロジェクトまであります。通常、顧客プロジェクトはコアを拡張します。重要な機能の上書きは発生しません。コアには、リファクタリングを急ぐ必要のあるかなり悪い部分があると付け加えます。仕様はありますが、主に顧客プロジェクト向けです。コアの最悪の部分はテストされていません(そうではありません...)。 開発者は2つのチームに分かれており、スプリントごとに1つまたは2つのPOを使用しています。通常、1つの顧客プロジェクトは、チームとPOのいずれかに厳密に関連付けられます。 ここで私たちの問題:むしろ頻繁に、お互いのことを壊します。チームAの誰かがコア機能Yを拡張またはリファクタリングすると、チームBの顧客プロジェクトの1つに予期しないエラーが発生します。ほとんどの場合、変更はチーム間で発表されないため、ほとんどの場合、予期しないバグが発生します。POを含むチームBは、機能Yが安定していると考え、リリース前に変更を認識せずにテストしませんでした。 これらの問題を取り除く方法は?どのような「発表テクニック」を勧められますか?

4
Javaプログラムの高レベルの構造を文書化する方法は?
背景: 私の共同研究者と私は学術雑誌の記事を書いています。研究の過程で、Javaでシミュレーションプログラムを作成しました。シミュレーションプログラムを他の人が自由に利用できるようにしたいと考えています。GitHubリポジトリでコードをホストすることにしました。他の人が簡単に使用できるようにするために、次のような優れたドキュメントを作成します。 各クラスとメソッドのJavadoc コードの使用方法 コードの高レベルの構造を記述する 私の高レベルの質問は次のとおり です。プログラムの高レベルの構造を説明するために使用できる単語と図の良い例を提供できますか? これにはサブ質問として含まれます: どのパッケージにどのクラスが含まれているかをどのように示しますか? 他のパッケージに依存するパッケージをどのように表示しますか? プログラム内のオブジェクト/クラスがどのように連携するかをどのように示しますか? 私たちは、コードの設計にドメイン駆動設計原則を使用しようとしました。ドメイン内のオブジェクトと、これらのオブジェクトをエンコードする特定のソースコードファイルとの対応をどのように示しますか?(以下のプロジェクトの私の「ユビキタス言語」の説明を参照してください。) これまでにやったこと ユビキタス言語 コードの「ユビキタス言語」の説明をファイルのubiquitous-language.md次の内容に入れます。 このプロジェクトの目的は、異なるリードタイムモデル、レポート遅延、および需要モデルの下で、単一施設を備えた単純なサプライチェーンで補充ポリシーがどの程度うまく機能するかを調査することです。 各期間で、次のイベントが発生します。 出荷が現在の期間に施設に到着するようにスケジュールされている場合、施設の在庫レベルはX単位だけ増加します。 現在の期間がレポート期間であることがスケジュールに示されている場合、施設はレポートをサプライヤーに提出し ます。サプライヤーは、受信することができるレポート によって指定されるように、数週間の遅れまたは、瞬時スケジュール。 サプライヤがレポートを受信した場合、補充ポリシーに基づいて、 Xユニットの補充量を計算します。出荷製品のXユニットは、L期間のリードタイムの後に到着する予定であろう。 顧客は施設に到着し、製品のXユニットを要求します。満たされていない需要は失われます。 ソースコード構造 コードの不完全な「高レベル」説明をファイルstructure.mdに入れます。内容は以下のとおりです。 パッケージレベルの構造 最高レベルでは、ソースコードは3つのパッケージに編成されています。 com.gly.sfsmainメソッドを 持つメインクラスはこのパッケージにあります。 com.gly.sfs.model ドメインモデルクラスはこのパッケージにあります。 com.gly.sfs.util ヘルパークラスはこのパッケージにあります。

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