ソフトウェア工学

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

3
訪問者の安定性とインスタンスの柔軟性
設定ファイルを生成するGUIアプリケーションに取り組んでいます。構成モデルのクラス階層があり、その階層のオブジェクトツリーをいくつかの異なるコンテキストで使用しています。現在、ビジターパターンを使用して、コンテキスト固有のコードでモデルクラスを汚染しないようにしています。 interface IConfigurationElement { void acceptVisitor(IConfigurationElementVisitor visitor); } 以前のバージョンinstanceofでは、ビジターの代わりに一連の条件を使用していました。2つのアプローチを比較すると、次のトレードオフが見られます。 ビジター 新しいを追加する方が簡単で安全IConfigurationElementです。新しい宣言をに追加するだけIConfigurationElementVisitorで、コンパイラはすべてのビジター実装に対してエラーを生成します。ではinstanceofチェーンあなたは、新しい構成要素を拡張する必要があるすべての場所を覚えておく必要があります。instanceof複数の場所でロジックを複製するため、基本的にDRY原則に違反します。 訪問者パターンは一連の条件よりも効率的ですinstanceof instanceof の大きな利点instanceofは、その柔軟性です。たとえば、場合instanceof によっては同様にIConfigurationElement処理する必要がある実装のさまざまなサブセットに対して特別なソリューションを定義できます。対照的に、Visitorでは毎回、各実装クラスのメソッドを実装する必要があります。 この種の問題に対する一般的な解決策はありますか?どういうわけかビジターを適応させることができるので、いくつかのケースに共通のソリューションを提供できますか?

4
SQLステートメントからロジックを移動するのは良い考えですか?
私はプロのソフトウェア開発者にとって非常に新しいと言って、この質問の前置きをします。 私は社内の他のグループからデータを受け取り、このデータをビジネスエグゼクティブが使用できるレポートに変換するチームで作業しています。 データの転送と解析の過程で、データの多くの処理を行ういくつかのSQLステートメントがあります。ほぼすべてのSELECT用途はTRIM、SUBSTR、CASTなど広範囲に適切なサイズや形式にフィールドを軽減します。さらに、CASE内SELECTのステートメントを使用することで説明される特別なケースがたくさんあります。 私たちが使用するTeradataサーバーソフトウェアは、非常にわかりにくいエラーメッセージを出力します。その結果、どのデータがどのSQLステートメントを壊しているかについて、多くの推測を行います。 私の質問は、これらのやや複雑なSQLステートメントを、処理と特殊なケースの処理を省略した、より複雑でない形式に減らし、代わりにこれを外部のスクリプトまたはプログラムで実行することは良い考えでしょうか?これは意味がありますか?
8 sql  complexity 

6
hginit-ばかげた#ifdefs
ジョエル・スポルスキーの水銀の紹介を読んでいたとき、それは私を襲った: 「そして今、彼らがしていることは次のとおりです。各新機能は大きな#ifdefブロックにあります。そのため、1つのトランクで機能できますが、デバッグされるまで新しいコードが表示されることはありません。正直なところ、それはばかげています。」 なぜこれはとにかくばかげているのですか?これは、他に何もないにしても、単純に処理するのが簡単ではないですか?それは派手なことではありませんが、トリックを行います-少なくともあなたがすでにSubversionと「結婚」している場合。 欠点は何ですか?私は議論を理解していません。

1
Node.jsアプリのプライベートモジュール。それらをどこに置くか?
状況は次のとおりです。 Node.js開発環境でP1とP2の2つのプロジェクトを開発しています。 P1では、2つの単純なモジュール、mod1とmod2の開発が必要でしたP1/lib。これらはに保存されています。このモジュールの解決はそれぞれ、外部の依存関係をで見つけます P1/node_modules。P1に必要な依存関係は、npmを介してこのフォルダーにインストールされています。 他のプロジェクトP2でmod1を再利用したい画像ですが、ここで私の疑問が浮かび上がりました。私はできた... mod1をにコピーするだけP2/libです。レプリケーションなので、このオプションは考慮していません。 P2から、P1からmod1を参照しますrequire($PROJECTS_DIR + '/P1/lib/mod1')。この方法では、P2はP1に依存します。 mod1を上位レベルのディレクトリに配置するか、NODE_PATHを使用して、P1とP2がdointだけで解決できるようにしrequire('mod1')ます。ただし、展開するときは、少し汚いように見えるこの上位レベルのディレクトリも展開する必要があります。 mod1をnpmモジュールとして扱い、どのプロジェクトや環境にも簡単にインストールできるようにしたいのですが、この特定のケースでは、モジュールをnpmに公開できないので、プロジェクト固有のものです。プライベートnpmリポジトリを作成してmod1を中に入れることができます。これの要点は、本番環境からもアクセスできるように設定することです。その価値はありますか? それをすべてまとめてnode_modulesどうですか?(外部の依存関係と自分のライブラリ)。`require( 'module')のようにモジュールが必要なだけなので、それは素晴らしいことです。しかし、それもかなり汚いようです。 npm link展開時にどのように機能するかわかりません。シンボリックリンクを作成します。GitまたはSVNを介してコードをコミットする場合は、このリンクはたどられません。npm install本番環境で実行すると、リンクされたモジュールもインストールされますか? 上記のどれも私を完全に満足させません。これらの1つが適切かどうか、または他の提案があるかどうかはわかりませんが、他のプロジェクトで簡単に再利用できるように、独自のプライベートライブラリを構築するための好ましい方法はありますか?

1
モバイル用のWCFまたはWebAPIを使用する利点はありますか?
Mono TouchとMono for Androidを使用した最初のモバイル開発を行っています。私が設計しているASP.NET MVC 4サイトと通信してほしい。私は過去にWCFとWebAPIを使用したことがありますが、このコンテキストで他のものを使用するよりも定量化できる利点があるかどうか疑問に思っていますか?

3
非機能的な変更はどのようにコミットする必要がありますか?
私は中小規模のレガシーコードベースで作業しており、チケットで作業しているときに、クリーンアップが必要なコードや、アプリケーションのフォローを理解するためだけにクリーンアップが必要なコードに遭遇します。 実際の例は次のとおりです。 if( !a && b ){ doSomething1(); doSomething2(); doSomething3(); doSomething4(); doSomething5(); }else if( a ){ doSomething1(); doSomething2(); doSomething3(); doSomething4(); doSomething5(); }else if( !b && ( a || c ) ){ doSomething1(); doSomething2(); doSomething3(); doSomething4(); doSomething5(); } もう1つは、数十のソースファイルにわたってコメントとドキュメントのタイプミスとエングリッシュを修正することです。 しかし、多くの場合、このクリーンアップは主な問題とは無関係になり、クリーンアップをコミットするのがどのように最善かと思います。私の見方では、3つのオプションがあります。 修正前:これは発生順になっているため、年代順に機能しますが、何かが壊れると修正が複雑になり、修正を本番環境と比較することが難しくなります。また、ノイズである追加のコミットが導入されます。 修正あり:しかし、これにより、欠陥のあるコードをfindGeoragphyが正しいファイルで実際に置き換えることができなくなりfindGeographyます。 修正後:これには、コードを理解し、修正を再テストし、修正をコミットしてから、元に戻ってクリーンアップをやり直すために行った削除とクリーンアップが必要です。これにより、欠陥のあるコードとの最も明確な相違が可能になりますが、作業が重複し、偽のコミットにつながる可能性もあります。 tl; dr:では、クリーンアップコードをコミットする最良の方法は何ですか? コンテキスト:ユニットテストはありません。変更を実行し、それらを目立たせ、壁を越えてQAに送信し、手動の回帰修正によって検証することにより、開発を進めます。また、フォームのクリーンアップを行わないと、コードがわかりにくくなります。これは理想からかけ離れていることは知っていますが、これは私の選択ではなく、私の食卓に食物を載せる実際のエンタープライズ開発者です。

6
ランダムなコードスニペットを見ることは、プロジェクトの品質をすばやく判断するのに役立ちますか?
今まで見たことのないプロジェクト(通常、使用するかどうかを検討しているオープンソースプロジェクト)の品質を把握するために、ランダムファイルを開いてコードの細部を見ることから始めることがよくあります。 私は次のものを探します: スタイル(言語で認められている規則に従っていますか、一貫していますか) コメントの品質と一貫性 共通言語固有の落とし穴(たとえば、一貫し===てJavaScriptで使用しない) 論理的に構造化されているように見えますか これにより、コードの目的がまったく分からなくても、コードを書いた開発者のスキルがよくわかります。 これは便利だと人々は思いますか?実際にどのように機能するかについての知識がないと仮定して、プロジェクトのコードベースの品質を迅速に評価するために何を考慮する必要がありますか?

4
DVCSを使用したリリースサイクルの短縮
CVCSではなくDVCSを使用するという選択は、実際にはリリースサイクルの短縮につながりますか?もしそうなら、何がソフトウェアリリースサイクルをより短くするのですか、そしてこれに対する議論は何ですか? プルリクエストに関連していますか?パッチの簡単な提出がここで役割を果たしますか? 人的要因に関連していますか?CVCSを使用するプロジェクトチームは、リリーススケジュールに対してより保守的に機能しますか? 他の要因はありますか?


4
ACオブジェクトのC ++ラッパーの優れたデザインパターン
非常に使いにくいだけでなく、非常に便利なCライブラリの周りに拡張可能なC ++ラッパーを作成しました。目標は、オブジェクトの割り当て、プロパティの公開、オブジェクトの割り当て解除、セマンティクスのコピーなどのためにc ++の便利さを持たせることです... 問題はこれです。Cライブラリは、基になるオブジェクト(オブジェクトへのポインタ)を必要とする場合があり、クラスデストラクタは、基になるメモリを破棄しないでください。ほとんどの場合、デストラクタは基になるオブジェクトの割り当てを解除する必要があります。bool hasOwnershipクラスにフラグを設定して、デストラクタ、代入演算子などが、基礎となるメモリを解放する必要があるかどうかがわかるように実験しました。ただし、これはユーザーにとって煩雑であり、別のプロセスがそのメモリをいつ使用するかを知る方法がない場合もあります。 現在、基本的な型と同じ型のポインターから割り当てが行われる場合に、hasOwnershipフラグを設定するように設定しています。オーバーロードされたコンストラクターがcライブラリーからのポインターを使用して呼び出されたときも、同じことを行います。それでも、ユーザーがオブジェクトを作成し、それをc_apiを呼び出す関数の1つに渡した場合、これはまだ処理されません。ライブラリは、後で使用するためにポインターを格納します。オブジェクトを削除した場合、Cライブラリでsegfaultが発生することは間違いありません。 このプロセスを簡略化するデザインパターンはありますか?多分ある種の参照カウント?

2
APIのイベントリスナーパターン-同じリスナーを2回追加するとどうなりますか?
イベントリスニングインターフェイスを提供するAPIの設計では、リスナーの追加/削除の呼び出しを処理する方法が2つ競合しているようです。 addListenerを複数回呼び出しても、1つのリスナーのみが追加されます(セットに追加するなど)。removeListenerを1回呼び出すだけで削除できます。 addListenerを複数回呼び出すと、毎回リスナーが追加されます(リストに追加するなど)。removeListenerへの複数の呼び出しでバランスを取る必要があります。 私はそれぞれの例を見つけました:(1)-ブラウザーのDOM addEventListener呼び出しはリスナーを1回だけ追加し、同じリスナーを2回追加する要求を静かに無視します(2)-jQuery .on動作はリスナーを複数回追加します。 SWTやSwingイベントリスナーなど、他のほとんどのリスナーAPIは(2)を使用しているようです。(1)を選択した場合、同じリスナーを2回追加する要求があったときに、通知なしに失敗するのか、エラーで失敗するのかという問題もあります。 私の実装では、よりクリーンなセットアップ/ティアダウンタイプのインターフェースを提供し、「セットアップ」が意図せずに2回行われ、私が見たほとんどの実装と一致するバグを明らかにするため、私は(2)に固執する傾向があります。 これは私の質問につながります-他の実装に向いている特定のアーキテクチャまたは他の基本的な設計はありますか?(つまり、なぜ他のパターンが存在するのですか?)

1
SICP-フィルターが既にリストを返しているときにconsでaccumulateを使用する理由
でSICP第2版のセクション2.2.3、著者は次のコードを持っています: (define (even-fibs n) (accumulate cons nil (filter even? (map fib (enumerate-interval 0 n))))) 私の質問は、なぜ彼らが使用したのされ蓄積し、この場合には?彼らはaccumulate を使用せずにフィルターから同じ答えを得られなかった でしょうか?
8 scheme  sicp 

4
Google App Engine、利点と制限は何ですか?
まず、Pythonアプリ向けのGoogle App Engineの特定の利点を知っている人はいますか?HerukoまたはAppfogに勝る利点はありますか?データベースAPIについてはどうですか? では、制限についてはどうでしょうか?GAEの使用について2度考えさせられる要因はありますか?

1
古いコミットに他人の著作権情報を含めるのを忘れた場合はどうなりますか?
パブリックソースコードリポジトリがあるとします。他の人のオープンソースコードのすべての著作権情報をまだ追加していない古いコミットがある場合、私は著作権法に違反していますか? 詳細:次の理論的なシナリオを検討してください。 他の誰かのオープンソースコードファイルをリポジトリにコピーして貼り付けます。 コミットします。 上記のファイルの先頭に著作権とライセンス情報を追加します。 コミットします。 何ヶ月も経ち、多くの人がさまざまなバージョンのマスターブランチをフォークします。 今、何ヶ月も後に、私はコミットされていないファイルがあることに気づきました。1著作権情報なし。 上記の2つのコミットを押しつぶし、リポジトリ全体をリベースする必要がありますか?(公開されていますが、誰もが迷惑になりますか?) または、現在のレポバージョンが必要なすべての著作権情報を提供することで十分ですか? 言い換えると、Gitの場合:すべてのGitブランチのHEAD、およびすべての「公開された」Gitタグに、必要なすべての著作権およびライセンス情報が含まれている場合、それで十分だと思いますか?そして、彼らが他のコミットをチェックして再配布するのは他の人々の責任でしょうか?または私は犯人であり、刑務所に入れられますか?

1
ドメインモデルとクエリ
私はDDDに不慣れで、貧弱なモデルのトランザクションスクリプトアプリ、または単にBig Balls of Mudでのみ働いていたので、私が乱用した用語を許してください。 ドメインモデルとリポジトリの適切な分離を理解しようとしています。(信じられないほど単純化された)オブジェクトをステータス(戻り値enumerable)またはIDでクエリする必要があると仮定して、データベースからのドメインオブジェクトを構築する適切な方法は何ですか。 ファクトリはオブジェクトを構築し、DIedリポジトリを使用してメソッドを公開する必要がGetByStatus()ありGetByID()ますか? DTOからドメインモデルを構築する方法を知っていて、リポジトリを直接呼び出す必要がありますか? ドメインモデルには、IDによる取得用のコンストラクターがあり、DIedリポジトリを使用して初期状態をロードし、リストに他の(?)メソッドを使用する必要がありますか? 私は最善の方法が何であるか本当にわかりません、そしてこの質問はそれぞれを擁護する答えを持っています(これらは確かに相互に排他的です)。

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