ソフトウェア工学

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

2
メソッドパラメータとしての識別子とドメインオブジェクト
メソッドと関数のパラメーターとしてのオブジェクトと一意のIDの使用について賛成または反対の客観的な引数はありますか?(および他のオブジェクトのメンバー?)。特に静的型付け言語のコンテキスト(C#/ Java / Scala) オブジェクト自体の長所: よりタイプセーフな呼び出し。IDを使用すると、引数の順序が誤ってしまうリスクがあります。これは、そのクラスのIDのみを格納するクラスごとに「ミニ」クラスを保持することで軽減できます。 永続化から一度取得し、再度取得する必要はありません (:courtsey - IDと、IDタイプが変更された場合、INTを言う>長い、そして...ミスの可能性が軒並み変更を必要とするhttps://softwareengineering.stackexchange.com/a/284734/145808) IDを使用するメリット: ほとんどの場合、実際のオブジェクトは必要ありません。uniqueidで十分です。そのため、IDがあれば、永続化から取得する時間を節約できます。 これらのテクニックの混合は、私が見る限り、両方の長所と短所の両方を持っています。 これが具体的に定義された問題であることを考えると、「私は思う」または「好き」タイプではなく、客観的な答えがあることを願っています... :-)。 編集:コメンターの提案に関するコンテキスト-唯一の制限は静的に型付けされた言語です。このアプリケーションは汎用アプリケーションですが、特定の使用シナリオに基づいて回答を得ることもできます。 編集:もう少しコンテキスト。書籍管理システムがあるとします。私のモデルは: Book: { id: Int, isbn: String, donatedBy: Member, borrowedBy: Member } Member: {id: Int, name: String} Table- wishlist: { isbn: String, memberId: Int} Table- borrows: { id: Int, memberId: Int} Method: isInWishList( book: …

1
SQLiteは、数値列への非数値の挿入を受け入れなければ、あまり役に立たないでしょうか?
SQLiteでは、次のステートメントが成功し、文字列がSALARYタイプの列に挿入/更新されますINTEGER。 update employee set salary='TOO MUCH' where emp_id=1; ゼロは挿入/更新されませんが、実際の"TOO MUCH"文字列なので、これは自動型変換に関するものではないことに注意してください。 FAQは述べています: これは機能であり、バグではありません。SQLiteは動的型付けを使用します。データ型の制約は適用されません。任意のタイプのデータを(通常は)任意の列に挿入できます。任意の長さの文字列を整数列に入れたり、浮動小数点数をブール列に入れたり、日付を文字列に入れたりできます。CREATE TABLEコマンドで列に割り当てるデータ型は、その列に入れることができるデータを制限しません。すべての列は、任意の長さの文字列を保持できます。(例外が1つあります。INTEGERPRIMARY KEYタイプの列は64ビットの符号付き整数しか保持できません。整数以外のものをINTEGER PRIMARY KEY列に挿入しようとすると、エラーが発生します。) したがって、この動作は明らかに意図的なものですが、 SQLiteがこの動作をするのはなぜでしょうか。私が知っている他のほとんどのSQLデータベースはまったく異なる動作をするため、非数値文字列を挿入しようとすると、エラーが発生するか、文字列0に変換されます。数値列。 SQLiteライブラリは、この振る舞いなしではあまり役に立ちませんか? これは、ライブラリを小さく高速に保つために設計されたものですか? 文字列を数値列に挿入しようとするとエラーが発生するために、SQLiteライブラリは大幅に遅くなったり大きくなったりしますか?
10 design  sqlite 

1
ライセンスのないコードの使用
たとえば、開始されたが完全ではないか、完全ではないgithubプロジェクトを見つけようとしていて、そのコードをより大きなプロジェクト内で使用したいと思ったが、コードの作成者がコードのライセンスを指定していなかったとします。このコードの許容される使用法?それを好きな目的に使用できますか、コードに暗黙のライセンスがありますか? しかし、私はコードを使用していますが、私は間違いなくクレジットと参考文献を提供します(礼儀外)。 しかし、これにより2つのボーナス質問が発生します。 プロジェクトでコードを使用できる場合、そのプロジェクトの残りの部分と同じライセンスを自由に使用できますか、それともコードを単独でライセンスすることもできますか? コードにライセンスを後日追加する場合、それはコードの将来のリリースにのみ影響しますか?たとえば、ライセンスされていない何かをforkし、元の作成者がall rights reservedの著作権を追加した場合、ライセンスの追加前であれば、forkされたコードを使用できますか?

2
DDD-多数の子を持つ集合ルート
私はこの質問の前置きとして、私はDDDに比較的慣れていないので、ここでいくつかの根本的な間違いを犯しているかもしれないと言います。 私は、(財務的な意味で)アカウントとトランザクションの概念を含むプロジェクトに取り組んでいます。アカウントはそれに対して入力された多くのトランザクションを持つことができます。 アカウントとトランザクションは両方ともエンティティであり、アカウントはトランザクションを含む集約ルートであるように見えます。これは、トランザクションがアカウントなしでは存在できないためです。 しかし、これをコードに適用するようになると、すぐに問題が発生しました。多くの場合、アカウントのすべてのトランザクションのリストを常に保持しておくことは、特に役に立ちません。アカウントの残高を計算したり、与信限度などの不変条件を適用したりできることに興味がありますが、トランザクションのサブセットを簡単に操作できるようにしたい(たとえば、日付範囲内のトランザクションを表示したい)。 後者の場合、私が使用していた場合、TransactionRepositoryリスト全体(場合によっては非常に大きい)をロードすることなく、必要なオブジェクトだけに効率的にアクセスできます。ただし、これにより、アカウント以外のものをトランザクションで使用できるようになります。つまり、アカウントの概念を集約ルートとして破っています。 このような状況に人々はどのように対処しますか?集約ルートに対して潜在的に膨大な数の子をロードすることによるメモリとパフォーマンスへの影響を受け入れますか?

2
デタッチされたが等しいオブジェクトを使用して、アタッチされたオブジェクトを更新できますか?
外部APIから映画データを取得します。最初のフェーズでは、各映画をかき取り、自分のデータベースに挿入します。2番目のフェーズでは、APIの「変更」APIを使用してデータベースを定期的に更新します。このAPIをクエリして、情報が変更された映画を確認できます。 私のORMレイヤーはEntity-Frameworkです。Movieクラスは次のようになります。 class Movie { public virtual ICollection<Language> SpokenLanguages { get; set; } public virtual ICollection<Genre> Genres { get; set; } public virtual ICollection<Keyword> Keywords { get; set; } } この問題は、更新が必要な映画がある場合に発生します。私のデータベースは、追跡されているオブジェクトと、更新API呼び出しから受け取った新しいオブジェクトを、を無視して別のオブジェクトと見なし.Equals()ます。 これにより、更新されたムービーでデータベースを更新しようとすると、既存のムービーを更新する代わりにデータベースが挿入されるため、問題が発生します。 以前この言語で問題がありましたが、私の解決策は、アタッチされた言語オブジェクトを検索し、それらをコンテキストから切り離し、それらのPKを更新されたオブジェクトに移動して、それをコンテキストにアタッチすることでした。ときにSaveChanges()今実行され、それは基本的にそれを交換します。 Movieオブジェクトへのこのアプローチを続けると、映画、言語、ジャンル、キーワードを切り離し、データベースでそれぞれを検索し、IDを転送して、新しいオブジェクト。 これをよりエレガントに行う方法はありますか?理想的には、更新されたムービーをコンテキストに渡し、Equals()メソッドに基づいて更新する正しいムービーを選択し、そのすべてのフィールドを更新し、各複雑なオブジェクトを更新したい場合:独自のEquals()メソッドに基づいて既存のレコードを再度使用し、それはまだ存在していません。 アタッチされている.Update()すべてのオブジェクトの取得と組み合わせて使用​​できる各複雑なオブジェクトにメソッドを提供することで、デタッチ/アタッチをスキップできますが、それでも、すべての既存のオブジェクトを取得して更新する必要があります。

2
ヒューリスティックアルゴリズムを単体テストするにはどうすればよいですか?
ルート検索アルゴリズムがあるとします。 def myHeuristicTSP(graph): /*implementation*/ return route これをユニットテストしたいと思います: class TestMyHeuristicTSP: def testNullGraphRaiseValueError(self): self.assertRaises(ValueError, myHueristicTSP(None)) def testSimpleTwoNodeGraphReturnsRoute: self.assertEquals(expectedResult, myHeuristicTSP(input)) 問題は、非ヒューリスティックTSPアルゴリズムの場合、さまざまなグラフを提供し、常に絶対最短ルートを返すことを確認できることです。 しかし、ヒューリスティックアルゴリズムはまだ確定的ではありますが、予測可能性が低いため、アルゴリズムがどのように機能するかを理解し、それらのエッジケースを見つけることを単に目的としていますか?

2
システムのJava部分の外で列挙型を参照するには、文字列またはintを使用する方が良いですか?
私はJavaでの列挙型の使用について私の仕事で議論をしていました。 同僚は、サーバー側で列挙型を使用する場合、必要に応じてそれを参照するために文字列を使用する必要があると主張していました(たとえば、JSからサーバーにデータを送信するとき、またはデータベースに格納するとき)、これははるかに明確であると主張しました開発者にとって、またタイプミスの場合にはすぐに失敗するだろうと主張しました。 これらの場合、列挙型を識別するために常に整数を使用しました。それは不変の識別子であり、大文字と小文字の違いやタイプミスの問題がないためです(開発者が1ではなく2を使用するというミスを犯したとしても、すぐには失敗しません)。 これらの引数について非常に分析的であるので、文字列を使用する方が良いと思いますが、私はそれについて不思議な気持ちになります(まるで良いアプローチではなかったかのように)。 この議論に関して私を導くことができるベストプラクティスはありますか? 編集:可能な場合は常に列挙型自体を使用するため、すべてのJavaコードは列挙型を使用します。「enumへの参照」とは、JavaScriptからサーバーにデータを交換するとき、またはデータベースにデータを格納するときに、enumの値を参照することを意味します

2
GCCはC ++自体で記述されているため、鶏と卵の問題はありませんか?
4.8リリース以降、C ++コンパイラGCC(そのG ++部分)は、CではなくC ++自体で記述されています。これについて架空の質問があります。 まだC ++コンパイラがない新しいプラットフォームでGCCのC ++コードをコンパイルする方法を知りたいです。もちろん、他のマシンでコンパイルされたビルド済みのバイナリを使用することもできます。または、Cで書かれた古いバージョンのGCCを使用して、現在のバージョンをコンパイルすることもできます。 しかし、ビルド済みのバイナリがなく、最新バージョンがないと、行き詰まっていましたよね?そうでない場合、GCCプロジェクトのCからC ++への切り替えによって引き起こされるこの状況に他の影響がありますか?
10 c++  compiler  gcc 

2
イベントの送信者は常に汎用オブジェクトである必要がありますか?
C#でイベントをプログラミングするときは、次の形式でデリゲートを作成することをお勧めします。 delegate XEventHandler(object sender, XEventArgs e); 私の質問は、デリゲートの最初の引数ですobject sender。常にジェネリックである必要がありobjectますか?タイプの送信者があると、object常に次のようなコードになります。 val = ((ConcreteType)sender).Property; または、さらに詳細な、 ConcreteType obj = sender as ConcreteType if (obj != null) { ... } 強く型付けされた送信者に対する1つの議論は、他のオブジェクトが型を気にすることなくイベントを転送できることです。これはGUI環境では理にかなっているかもしれませんが、GUI以外でもメリットがあるかどうかはわかりません。 送信者のクラスが常に(少なくとも抽象クラスとして)わかっている場合はどうなりますか?私は実装していますたとえば、ListChanged抽象的にイベントをListクラス、および他のクラスは、(例えば、それを継承しようとしている場合はLinkedList、ArrayList)、それはタイプの送信者と私のデリゲートを定義するために、すべての権利でありますかList? delegate ListChangedEventHander(List sender, ListChangedEventArgs e); または、従来型object senderをより具体的なタイプに変更することの欠点はありますか?
10 c#  event 

3
次数引数を指定したトリガー関数が-0.0を返すのはいつですか?
トリグ関数を作成する際にmy_sind(d)、my_cosd(d)、my_tand(d)、度引数はなくラジアンいずれかを使用し、90の倍数で正確な回答を提供される、私は結果が時々あったことに気づいた-0.0のではなく0.0。 my_sind( 0.0) --> 0.0 my_sind(-0.0) --> -0.0 my_sind(180.0) --> -0.0 my_sind(360.0) --> 0.0 sin()そしてtan()、典型的には、所与の記号ゼロ入力に対して同じ符号ゼロ結果を返します。これは、意味になりmy_sin()一致している必要がありsin()、それらの入力のために。 my_sind( 0.0) alike sin( 0.0) --> 0.0 my_sind(-0.0) alike sin(-0.0) --> -0.0 質問です:全体の数は、何のためにnon_zero_n/結果は、これまで返すことがなければならない-0.0ためmy_sind(180*non_zero_n)、my_cosd(180*n + 180)、my_tand(180*non_zero_n)? コードを書くのは簡単なので、それをf(-0.0)生成して実行するだけ-0.0です。他の(ゼロ以外の)に対して他の f(x)リターンを行う理由があるかどうか、そのサインを保証することの重要性について簡単に疑問に思います。-0.0x 注:これは、なぜ0.0vs -0.0が発生するかという問題ではありません。これが理由でcos(machine_pi/4)戻りません0.0。これは、0.0またはの生成を制御する方法の問題でもありません-0.0。私はそれをデザインの問題と考えています。
10 c  math 

1
C ++での移動セマンティクス-ローカル変数のMove-Return
私の理解では、C ++ 11では、関数からローカル変数を値で返す場合、コンパイラーはその変数をr値参照として扱い、それを関数から「移動」して返すことができます(もちろん、RVO / NRVOは代わりに発生しません)。 私の質問は、これは既存のコードを壊すことができないのですか? 次のコードを検討してください。 #include <iostream> #include <string> struct bar { bar(const std::string& str) : _str(str) {} bar(const bar&) = delete; bar(bar&& other) : _str(std::move(other._str)) {other._str = "Stolen";} void print() {std::cout << _str << std::endl;} std::string _str; }; struct foo { foo(bar& b) : _b(b) {} ~foo() …
10 c++  c++11 

1
Groovyの特性、継承、インターフェース、いつ使用するのですか?
私はGroovyを学んでいて、2.3で追加された新機能であるTraitsの追加について学びました。今の私には、Traitsを使用すると、基本的にスーパークラスとインターフェイスで実行できるすべてのことを実行できるように見えます。 Groovyにトレイトを追加すると、継承とインターフェースが廃止されますか? そうでない場合、これらの各メカニズムを使用するのに最適な時期はいつですか?

3
C ++:C ++機能ではなくコンパイラAPIを使用したメタプログラミング
これはSOの質問として始まりましたが、それはかなり型破りであり、Webサイト上の実際の説明に基づくと、質問には多くの概念的な重みがあるため、programmers.seに適している可能性があることに気付きました。 私はclang LibToolingを学習してきましたが、これは非常に強力なツールであり、コードの「ぎこちない」全体をフレンドリーな方法で、つまりセマンティックな方法で、推測することなく公開できます。clangがコードをコンパイルできる場合、clangはそのコード内のすべての単一文字のセマンティクスについて確実です。 ここで、少し前に戻ります。 C ++テンプレートのメタプログラミングに従事する場合(特に、恐ろしいマクロではあるが、テンプレートを超えて賢い領域に冒険する場合)には、多くの実用的な問題が発生します。正直なところ、私も含めて多くのプログラマーにとって、テンプレートの通常の使用法の多くは、やや恐ろしいものです。 良い例は、コンパイル時の文字列だと思います。これは、1年以上前の質問ですが、現時点でのC ++では、これが単なる人間にとって容易ではないことは明らかです。これらのオプションを見るだけでは吐き気を誘発するのに十分ではありませんが、それでも、私が自分のソフトウェアで使用している空想のアプリケーションに適合する魔法の、最大限に効率的なマシンコードを生成できるかどうか自信がありません。 正直言って、皆さん、文字列はかなりシンプルで基本的なものです。私たちの中には、特定の文字列が単純な方法でコーディングする場合よりも大幅に「組み込まれた」マシンコードを生成する便利な方法を求めているだけです。私たちのC ++コードで。 clangとLibToolingを入力します。これにより、ソースコードの抽象構文ツリー(AST)が公開され、シンプルなカスタムC ++アプリケーションRewriterが、ASTのすべての豊富なセマンティックオブジェクト指向モデルと一緒に、生のソースコードを(確実に)正しく正確に操作できるようになります。それは多くのものを扱います。マクロ展開について知っているので、それらのチェーンをたどることができます。はい、私はソースからソースへのコード変換または変換について話しています。 ここでの私の基本的な論点は、clangにより、C ++ソフトウェアの理想的なカスタムプリプロセッサステージとして機能する実行可能ファイルを作成できるようになり、これらのメタプログラミングステージをC ++で実装できるということです。このステージは、有効なC ++コードである入力を受け取り、より有効なC ++コードを出力として生成する必要があるという事実に制約されます。さらに、ビルドシステムが適用するその他の制約。 結局のところ、clangはコンパイラのフロントエンドであり、APIを使って独創的であるため、入力は少なくとも有効なC ++コードに非常に近い必要があります。使用する新しい構文を定義できるようにする準備があるかどうかはわかりませんが、これを正しく解析してclangプロジェクトに追加する方法を開発する必要があることは明らかです。これ以上期待することは、clangプロジェクトに範囲外の何かを含めることです。 問題ない。一部の何もしないマクロ関数がこのタスクを処理できると思います。 私が説明していることを確認する別の方法は、言語自体で利用できるより限定されたツールを使用して実装する代わりに、ソースコードのAST(clangとそのAPIのおかげ)を操作することにより、ランタイムC ++を使用してメタプログラミング構成を実装することです。これには、明らかなコンパイルパフォーマンスの利点もあります(テンプレートが多いヘッダーでは、使用頻度に比例してコンパイルが遅くなります。コンパイルされたものの多くは、慎重に照合され、リンカーによって破棄されます)。 ただし、これには、ビルドプロセスに追加の手順を1つまたは2つ追加するコストと、ツールの一部として(確かに)多少冗長なソフトウェア(ただし、少なくとも単純なランタイムC ++)を記述する必要があります。 。 それは全体像ではありません。コア言語の機能では非常に困難または不可能であるコードを生成することで、はるかに大きな機能空間を確保できると確信しています。C ++ではテンプレート、マクロ、またはその両方のクレイジーな組み合わせを記述できますが、clangツールでは、セマンティックコンテンツへのフルアクセスを持ちながら、実行時に C ++で実現できる方法でクラスと関数を変更できます。テンプレートとマクロ、その他すべてに加えて。 それで、なぜ誰もがまだこれをしていないのかと思っています。clangのこの機能は非常に新しく、clangのASTの巨大なクラス階層に誰も精通していないのでしょうか?それはそれではありえない。 おそらく、私はこれの難しさを少し過小評価しているだけですが、clangツールを使用して「コンパイル時の文字列操作」を行うことは、犯罪的にほぼ単純です。冗長ですが、非常に単純です。必要なのは、実際の実際のstd::string操作にマップする一連のno-opマクロ関数だけです。clangプラグインは、関連するすべてのno-opマクロ呼び出しをフェッチしてこれを実装し、文字列を使用して操作を実行します。このツールは、ビルドプロセスの一部として挿入されます。ビルド中に、これらのno-opマクロ関数呼び出しは自動的にその結果に評価され、プログラム内の単純な古いコンパイル時文字列として挿入されます。その後、プログラムは通常どおりコンパイルできます。実際、結果として得られるこのプログラムは、結果としてはるかに移植性が高くなり、C ++ 11をサポートする豪華な新しいコンパイラーを必要としません。

1
GUI更新を管理するためのリアクティブプログラミングとMVVMパターン
リアクティブプログラミングとMVVMは、ドメインレイヤーをUIから分離する問題に対処できる2つのアプローチです。 MVVMは、UIコンポーネントにマップされたデータ構造であるビューモデルを定義することでこれを行います。UIはデータを表示し、ユーザーが発生したときにデータを更新する場合があります。 反応フレームワークは、データの一部が変更されたことをUIに通知するオブザーバブルのグラフを定義します リアクティブフレームワークは、主流のプラットフォーム(.netおよびjavaのRx、react.js)とより実験的な場所(haskellのFRP)の両方でマインドシェアを獲得しています。 私は主にangularでMVVMを使用しており、表現力に対するシンプルさの比率は非常に満足できるものだと思います。 リアクティブフレームワークは、mvvmが購入しない開発者に何を購入しますか? 本当に違いはありますか?たとえば、knockout.jsはmvvmフレームワークとしてアドバタイズされますが、そのインターフェースには反応的な感覚があります。 this.firstName = ko.observable("John"); this.lastName = ko.observable("Smith"); this.fullName = ko.computed(function() { return this.firstName() + " " + this.lastName(); }, this);
10 gui  mvvm  ui  reactive 

5
APIはいつ組み込みDSLと見なされますか?
APIと埋め込みドメイン固有言語(DSL)の違いは何ですか? 単なる構文ですか? OpenGLのようなAPIを検討してください。それはグラフィックDSLとどう違うのですか? つまり、APIが十分に複雑な場合、それは組み込みDSLと見なすことができますか?
10 api  dsl 

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