ソフトウェア工学

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

1
コード設計:任意の関数の委任
PPCGでは、King of the Hillの課題が頻繁に発生します。これは、異なるコードボットを互いに対戦させるものです。これらの課題を単一の言語に限定するのは好きではないため、標準のI / Oを介してクロスプラットフォームの通信を行います。 私の目標は、チャレンジライターがこれらのチャレンジをより簡単に書くために使用できるフレームワークを書くことです。次の要件を満たしました。 チャレンジライターは、メソッドが個別の通信のそれぞれを表すクラスを作成できます。たとえば、私たちのGood vs Evilチャレンジでは、ライターはメソッドを含むPlayerクラスを作成abstract boolean vote(List<List<Boolean>> history)します。 コントローラは、前述のメソッドが呼び出されたときに標準I / Oを介して通信する上記のクラスのインスタンスを提供できます。ただし、上記のクラスのすべてのインスタンスが標準I / Oを介して通信する必要があるとは限りません。ボットのうち3つはネイティブJavaボットである可能性があります(Player別の2つが別の言語である場合、クラスをオーバーライドするだけです)。 メソッドは常に同じ数の引数を持つわけではありません(また、常に戻り値を持つこともありません)。 チャレンジライターが私のフレームワークで作業するためにできる限り少ない作業を行う必要があります。 私はこれらの問題を解決するために反射を使用することに反対していません。私はチャレンジライターに次のようなことを要求することを検討しました: class PlayerComm extends Player { private Communicator communicator; public PlayerComm(Communicator communicator){ this.communicator = communicator; } @Override boolean vote(List<List<Boolean>> history){ return (Boolean)communicator.sendMessage(history); } } しかし、いくつかの方法がある場合、これはかなり繰り返しになる可能性があり、定数のキャストは楽しいものではありません。(sendMessageこの例では、可変数のObject引数を受け入れ、を返しますObject) これを行うより良い方法はありますか?

3
依存性注入を使用する場合、1つのクラスで許容できる注入の数
依存関係の注入にUnityをC#で使用していますが、この質問は、依存関係の注入を使用しているすべての言語とフレームワークに適用できます。 私はSOLID原理に従うようにしているので、多くの抽象化を得ました。しかし今、私は、1つのクラスが何回の注入を注入すべきかについてのベストプラクティスがあるかどうか疑問に思っていますか? たとえば、9つの注入があるリポジトリがあります。これは他の開発者にとって読みにくいでしょうか? 注射には次の責任があります。 IDbContextFactory-データベースのコンテキストを作成します。 IMapper-エンティティからドメインモデルへのマッピング。 IClock-DateTime.Nowを抽象化して、単体テストを支援します。 IPerformanceFactory-特定のメソッドの実行時間を測定します。 ILog-ロギング用のLog4net。 ICollectionWrapperFactory-コレクションを作成します(IEnumerableを拡張します)。 IQueryFilterFactory-dbをクエリする入力に基づいてクエリを生成します。 IIdentityHelper-ログインしたユーザーを取得します。 IFaultFactory-異なるFaultExceptionsを作成します(私はWCFを使用しています)。 私が責任を委任した方法に本当にがっかりしているわけではありませんが、読みやすさが気になり始めています。 だから、私の質問: クラスに必要な注射の回数に制限はありますか?もしそうなら、それを避ける方法は? 多くの注入は読みやすさを制限しますか、それとも実際にそれを改善しますか?

1
オブジェクトファイルの提供はLGPL再リンク句を満たしますか?
SOに関するこの質問から、私はそれを読みました: 独自のソースコード+ LGPLソースコード 静的にリンク: どちらもLGPLとしてリリースする必要があります。 または、ユーザーがアプリケーションを別のバージョンのLGPLソースコードに再リンクできるようにするすべてを提供します。この場合、他の要件は動的にリンクされた場合と同じです。 したがって、オブジェクトファイルを提供するだけで、LGPLライブラリを独自のコードアプリケーションに静的にリンクするという点でLGPLを満たすのに十分であるように思えます。実行可能ファイルは静的にリンクされていますが、オブジェクトファイルを提供すると、エンドユーザーはアプリケーションを再コンパイルして、異なるバージョンのライブラリにリンクできます。 これは正しいですか、正しくない場合は、なぜですか?

2
for-eachに「in」の代わりにコロンがあるのはなぜですか?
Java 5言語ガイドから: コロン(:)が表示されたら、「中」と読みます。 inでは、そもそも使ってみませんか? これは何年もの間私を悩ませてきました。他の言語と矛盾しているからです。たとえば、Java では、C ++、Scala、Rubyのようなシンボルの代わりに、型間の関係implementsにextends、がありますsuper。 5つのコンテキストで使用されるJavaコロン。3つはCから継承され、他の2つはJoshua Blochによって承認されました。少なくとも、それは彼が「閉鎖論争」の話の間に言ったものでした。これは、for-eachのセマンティクスと矛盾するマッピングとしてのコロンの使用を批判したときに発生します。これは、for-eachが乱用された予想パターンであるため、私には奇妙に思えます。同様list_name/category: elementsかlaberl/term: meaning。 私はjcpとjsrを調べましたが、メーリングリストの兆候は見つかりませんでした。この問題に関する議論はグーグルによって見つかりませんでした。のコロンの意味に戸惑う初心者のみfor。 inこれまでに提供されたものに対する主な議論: 新しいキーワードが必要です。そして 字句解析を複雑にします。 関連する文法定義を見てみましょう: ステートメント : 'for' '(' forControl ')'ステートメント | ... ; forControl :EnhancedForControl | forInit?「;」表現?「;」forUpdate? ; EnhancedForControl :variableModifier *タイプvariableDeclaratorId ':'式 ; から変更する:とin、複雑さが増したり、新しいキーワードが必要になったりしません。
9 java 

4
ソース管理に削除された有用なコードがあるかどうかを判断するにはどうすればよいですか?
だから私はこの質問を読んでいましたが、参照されていないコードを削除する必要がありますか? 後で必要になった場合に備えて、コードは参照用にソース管理されているため、参照されていないコードを削除するというアドバイスがありました。 この削除されたコードをどのように整理して、後のバージョン(または他のプログラマー)が後で見つけられるようにしますか?どういうわけか、別のブランチを作成するか、それをソース管理でタグ付けしますか? 私はこれまでソース管理から削除されたコードを復活させたことはありません。私はほとんどそれを使って、まだ生きているコードの変更を追跡しました。他の誰かの実験的な作業が含まれる前にブランチを参照したので、トランクで削除されたコードの興味深いセクションをマークするための良い方法でしょうか?

3
別の関数から値を取得する関数は純粋と見なされますか?
副作用のない関数を作成するときにデフォルトの変数値を処理する方法を理解しようとしていますが、次のようになっています。 function getDefaultSeparator() { return ':'; } function process(input, separator) { var separator = separator || getDefaultSeparator(); // Use separator in some logic return output; } デフォルトのセパレーターは他の関数で使用され、1つの場所でのみ定義したいと思います。 これが純粋な関数である場合、代わりにグローバルDEFAULT_SEPARATOR定数を使用することとの違いは何ですか?

1
アレイに基づかないコンピュータアーキテクチャ[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 関数型プログラミングのモナドに関するWadlerの最初の論文(Haskell)、と彼は言う 長い歴史を持つもう1つの問題は、プログラムを配列の更新に基づくことが望ましいかどうかです。配列に基づくアルゴリズムとアーキテクチャの開発には多大な労力が費やされているため、この議論を回避し、答えが「はい」であると想定します。 他の可能なアーキテクチャへの引用やヒントはありません。Lispに適したアーキテクチャについて何か聞いたことがあります。誰かが私にこのトピックの/どこから始められるかについての説明とガイダンスを教えてくれますか?異なるアーキテクチャについて簡単に説明していただければ幸いです。

1
MVPパターンでは、ビューはUIコンテンツに基づいてモデルオブジェクトをインスタンス化する必要がありますか、それともこれらのコンテンツをパラメーターとしてプレゼンターに渡しますか?
開発中のAndroidアプリでMVPパターンを使用しています。 基本的に4つの要素があります。 新しいユーザーを追加できるAddUserView: AddUserPresenter UserInfo(pojo) UserInfoManager(ビジネスロジックとストレージマネージャー) 私の質問は: AddUserViewの「追加」ボタンを押すと、テキストビューのコンテンツが取得され、新しいUserInfoがインスタンス化されて、Presenterに渡されます。または、AddUserViewは単にtextViewsのコンテンツを取得してAddUserPresenterに渡す必要があります。これにより、実際にはUserInfoがインスタンス化され、UserInfoManagerに渡されますか?

2
オフラインシステムとの同期
私は、データを生成してサーバーに送信するモバイルデバイス(アプリケーションが埋め込まれている)からのビジネスデータを同期するシステムを設計しています。同期される各行は、データベースに特定のビジネスログを生成します。 同期するデータによって、ビジネスデータの最終変更日よりも古い日付(同期データ内)のデータが生成された場合、それを無視して、ログをデータベースに追加するだけです。アップロードされたデータが処理されると、データベースからデータがフェッチされ、デバイスにダウンロードされます。 書き込み直後のこのダウンロードのため、同期は同期でなければなりません。このような何かが私の既存のソリューションを置き換えるのに十分な価値がある場合は、まだリーダー/ライターのパターンを持つことが可能です。より重要なことは、最新のデータをダウンロードできることです。そのデータは全体としてフェッチされ、現時点では差分は実装されていません(後で来る可能性がありますが、問題はありません)。 同じビジネスオブジェクトで複数の同期を実行している可能性があります。それは起こりそうにありませんが、起こり得、それを処理できることを望んでいます。組み込みモバイルアプリケーションを数日間再同期せずに使用しない限り、同期は数秒続くことが予想されますが、数分は続きません。 同期されるデータの量は、同期プロセスも大きくなることは想定されていません。 つまり、同期の方法で相互排除を使用することになります。より正確には、Javaを使用し、読み取り専用の同期をブロックしないように、同期プロセス全体ではなく、書き込みメソッドに同期を設定します。 私が知りたいのですが : この方法が理にかなっていますか?同期プロセスの量と時間は許容範囲です。 一般的に、どのような概念を検討する必要がありますか。おまけ:Springモジュールにこれらの概念の実装がある場合。

1
銀行は実際にお金のデータ型として何を使用していますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 私はいくつかの良いオプションを知っています: セントまたは10 -nセントを表す大きな整数(int64_t、mpz_t、任意のbignum libなど)-たとえば、整数はペニーの1/100を表します($ 1.05 == 10500)。これは、スケーリングされた整数と呼ばれます。 JavaのBigDecimal、PythonのDecimal、JavaScriptのdecimal.js、C ++のboost :: multiprecision などの任意精度の10進数演算用の高レベルライブラリ 文字列。 パックBCD(2進化10進数)は、より難解な方法で、古いソフトウェアでは一般的でした。それについてもっと読んでください 。 銀行(またはクレジットカード、ATM、POSシステム)の量産コードで、実際に最も使用されているデータタイプはどれですか。特に銀行に勤めた方にお願いします。 編集:同じ問題ドメインを持つ人々にとって非常に便利なリンク(壊れない「お金」のデータ構造を実装する必要がある)。 http://martinfowler.com/eaaDev/quantity.html http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR http://c2.com/cgi/wiki?MoneyObject http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html これは重複する質問であると言ったフェローのためのEDIT:これは、「何が最良か」の理論的な質問ではなく、実際的な質問です。私の質問の未編集のタイトルを読んでください。銀行のコードベースで人々が直接目にしたものを尋ねています。 BigDecimalが「最高」であることは明らかですが、そのような素晴らしいAPIはどこでも利用できるわけではなく、信じられないかもしれません。また、10進数ライブラリはintとは対照的に高価です。

2
コードベースを依存性注入コンテナに徐々に移動する
多くの「アンチパターン」シングルトンを備えた大規模なコードベース、静的メソッドを含むユーティリティクラス、およびnewキーワードを使用して独自の依存関係を作成するクラスがあります。コードのテストが非常に困難になります。 依存性注入コンテナ(プロジェクトのGuice場合はGWT)にコードを徐々に移行したいと考えています。依存性注入についての私の理解から、それは全部かゼロかです。すべてのクラスは、Spring / Guiceによって管理されるか、まったく管理されません。コードベースが大きいので、コードを一晩で変換できません。ですから、徐々にそれを行う方法が必要です。 問題は、他のクラスに注入する必要のあるクラスから始めると、@Injectそれらのクラスがまだコンテナーによって管理されていないため、それらのクラスでシンプルを使用できないことです。したがって、これはどこにも挿入されない「トップ」クラスまでの長いチェーンを作成します。 私が見る唯一の方法は、Injector/アプリケーションコンテキストをシングルトンを通じてグローバルに利用できるようにすることです。これにより、他のクラスがそこからマネージドBeanを取得できるようになります。しかし、それcomposition rootはアプリケーションに明らかにしないという重要な考えと矛盾します。 もう1つのアプローチはボトムアップです。「高レベル」クラスから始めて、依存関係注入コンテナーにそれらを含め、ゆっくりと「小さい」クラスに移動します。しかし、まだグローバル/スタティックに依存しているこれらの小さなクラスをテストできるので、私は長い間待たなければなりません。 このような段階的な移行を実現する方法は何でしょうか? PS 依存性注入への段階的アプローチという質問はタイトルは似ていますが、私の質問には答えません。

7
なぜもっと多自然言語のプログラミング言語がないのですか?
複数の自然言語で利用可能で拡張可能なプログラミング言語はありますか? たとえば、英語バージョンのdo..whileループ、スペイン語バージョンのhacer..mientasループ、フランス語バージョンのa faire..pendant、オランダ語バージョンのdoe..terwijl。 この種の実装について考えることができる唯一の「プログラミング言語」は、Microsoft VBAです。 おまけの質問:なぜ複数の言語で提供されるプログラミング言語が少ないのですか?

4
ビジネスオブジェクトクラス設計のこの「完全にパブリック」な考え方に反対する方法
私たちは多くのユニットテストとビジネスオブジェクトのリファクタリングを行っており、クラスの設計について他のピアとは非常に異なる意見を持っているようです。 私がファンではないクラスの例: public class Foo { private string field1; private string field2; private string field3; private string field4; private string field5; public Foo() { } public Foo(string in1, string in2) { field1 = in1; field2 = in2; } public Foo(string in1, string in2, string in3, string in4) { field1 = …

3
同じ名前のクラスを処理する方法(異なるパッケージ)
私と私のR&Dチームは、大規模なコードベースを維持しています。ビジネスロジックを複数のパッケージに分割しました。そのうちのいくつかは持っている同じ名前のクラスを。 ご想像のとおり、両方のクラスが同じJavaファイルで参照されている場合、名前は競合します。 例えば: com.myapp.model (package) - Device (class) - ... com.myapp.data (package) - Device (class) - ... これらのケースを処理するためのベストプラクティスは何かについて議論があり、次のオプションが考えられました。 最初のオプション クラスの名前を変更し、接頭辞を追加する ModelDevice DataDevice 2番目のオプション 両方が参照されている場合の完全なパッケージ+クラス名の使用 com.myapp.model.Device com.myapp.data.Device コード管理とスケーラビリティの点でより正しいものは何ですか? 現在、両方のアプローチを組み合わせており、矛盾が生じ始めています

2
`Vector <float> .Equals`は再帰的である必要がありますか、それともIEEE 754セマンティクスに従う必要がありますか?
浮動小数点値が等しいかどうかを比較する場合、2つの異なる方法があります。 NaN一致する、それ自体に等しくないIEEE 754仕様。 NaN等価関係の定義に不可欠な反射性の数学的特性を提供する、それ自体に等しい C#(にIEEE浮動小数点型に内蔵floatし、doubleIEEEのためのセマンティクス従う)==及び!=(等リレーショナル演算子&lt;)が、ための反射性を確保しobject.Equals、IEquatable&lt;T&gt;.Equals(およびCompareTo)。 ここで、float/の上にベクター構造体を提供するライブラリについて考えますdouble。このようなベクトル型は過負荷になり==/ !=およびオーバーライドobject.Equals/ IEquatable&lt;T&gt;.Equals。 何皆に同意すると、そのある==/ !=IEEEセマンティクスに従ってください。問題は、そのようなライブラリーがEquals再帰的な方法で、またはIEEEセマンティクスに一致する方法で(等価演算子とは別の)メソッドを実装するかどうかです。 のIEEEセマンティクスを使用するための引数Equals: IEEE 754に準拠 SIMD命令を利用できるため、(おそらくはるかに)高速です。 私は、スタックオーバーフローについて、SIMD命令を使用して再帰的等式をどのように表現するか、およびそれらのパフォーマンスへの影響について、別の質問をしました。浮動小数点の等値比較のためのSIMD命令 更新: 3つのSIMD命令を使用して効率的に再帰的等式を実装できるようです。 のドキュメントでEqualsは、浮動小数点を使用する場合に再帰性は必要ありません。 次のステートメントは、Equals(Object)メソッドのすべての実装に当てはまる必要があります。リストには、x、y、およびznullではないオブジェクト参照を表します。 x.Equals(x)true浮動小数点型を含む場合を除いて、を返します。ISO / IEC / IEEE 60559:2011、情報技術-マイクロプロセッサシステム-浮動小数点演算を参照してください。 floatを辞書のキーとして使用している場合は、罪の状態にあり、正常な動作を期待するべきではありません。 再帰的であるという主張: それはを含む既存のタイプと一致だSingle、Double、TupleとSystem.Numerics.Complex。 Equals再帰的ではなく、IEEEに従うBCLの前例は知りません。カウンターの例としてはSingle、Double、TupleとSystem.Numerics.Complex。 Equals主に、反射性に依存するコンテナと検索アルゴリズムで使用されます。これらのアルゴリズムでは、動作を妨げる場合、パフォーマンスの向上は重要ではありません。パフォーマンスの正確さを犠牲にしないでください。 これは、すべてのハッシュベースのセットや辞書、壊れるContains、Find、IndexOfさまざまなコレクション/ LINQ、セットベースのLINQの操作(上Union、Exceptデータが含まれている場合など)NaNの値を。 IEEEセマンティックが受け入れられる実際の計算を行うコードは、通常、具象型で機能し、==/ !=(またはより可能性の高いイプシロン比較)を使用します。 ジェネリック演算が必要なため、現在ジェネリックを使用して高性能計算を作成することはできませんが、これらはインターフェース/仮想メソッドを介して利用できません。 したがって、遅いEqualsメソッドはほとんどの高性能コードに影響を与えません。 IEEEセマンティクスが必要な場合、またはパフォーマンス上の利点が必要な場合に、IeeeEqualsメソッドまたはを提供するIeeeEqualityComparer&lt;T&gt;ことができます。 私の意見では、これらの議論は再帰的な実装を強く支持しています。 MicrosoftのCoreFXチームは、そのようなベクトル型を.NETに導入することを計画しています。私とは異なり、彼らは主にパフォーマンス上の利点のために、IEEEソリューションを好みます。このような決定は最終リリース後も変わらないので、大きな間違いだと私が信じていることについてコミュニティからフィードバックを得たいと思います。

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