ソフトウェア工学

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

3
コードで抑制警告を使用することは良い習慣ですか?
私は@SuppressWarnings("unchecked")、@SuppressWarnings("null")ほとんどの場合上記の方法を使用して、警告なしでコードをコンパイルできるようにしていますが、疑問があります。このStackoverflowの質問が見つかりました。ジョン・スキートが興味深い答えを書いてくれました。 彼によると、 時々、Javaジェネリックスはあなたがやりたいことをさせないだけで、あなたがしていることが本当に実行時に合法であることをコンパイラに効果的に伝える必要があります。 しかし、例外がスローされる可能性がある場合はどうでしょうか?警告を抑制するのは悪い考えではありませんか?問題が表面化する可能性のある場所を意識する必要はありませんか? また、誰かが後で私のコードを変更し、SuppressWarningsを削除せずに疑わしい機能を追加した場合はどうなりますか?それをどのように回避できますか、および/またはこれに他の代替手段はありますか? 私が使用してしなければならない@SuppressWarnings("unchecked")と@SuppressWarnings("null")? アップデート#1 未チェックの型キャストに関する限り、この回答(以下のコメントで@gnatが指摘)によると、これらの警告を抑制することが必要です。 安全でない型キャストの必要性を排除するために、多くの不可欠なJavaライブラリが更新されたことはありません。これらの警告を抑制することは、他のより重要な警告に気づき修正するために必要です。 他の警告を抑制する場合は、まだ少し灰色の領域にあります。 アップデート#2 あたりとして、Oracleのドキュメント(以下もいくつかの回答で述べました): スタイルの問題として、プログラマーは常に、このアノテーションが最も効果的な場所で最も深くネストされた要素に使用する必要があります。特定のメソッドで警告を抑制したい場合は、クラスではなくそのメソッドに注釈を付ける必要があります。

1
JavaScriptファイルでmodule.exportsを宣言する場所に関する規則
module.exportsJavascript / Node.jsモジュールファイルを宣言しない場所に慣例はありますか? 次のようにファイルの先頭にある必要があります: module.exports = Foo; function Foo() { this.bar = 'bar'; } Foo.prototype.getBar = function() { return this.bar; } または、ファイルの最後にある必要があります。 function Foo() { this.bar = 'bar'; } Foo.prototype.getBar = function() { return this.bar; } module.exports = Foo; 技術的な違いはありません。最初の例は、宣言の巻き上げにより完全に有効です。 だから、ベストプラクティスはあるのかなと思っていました。

2
マルチテナンシーまたはマルチインスタンス?
私はWebベースのSaaSソリューションを構築しようとしており、マルチテナンシーまたはマルチインスタンスを使用するかどうかわからないところに行きました。私が達成しようとしていることと、それぞれのアプローチの長所と短所(読んだことによると私の意見)について説明しようと思います。どちらか一方のアプローチで何かを見逃した場合に備えて、提案を含めてください。 私が構築しようとしているアプリケーションは、前述したように、企業がアカウントを作成できるSaaSソリューションであり、各アカウント/企業には独自のユーザー、顧客、製品、サービスなどがあります。各ユーザー; 会社の従業員は誰ですか。1つのアカウント/会社に関連するユーザーは、その会社の顧客、製品、およびサービスにのみアクセスできます。企業は無制限の数の顧客、製品、サービスを持つことができるため、各企業には独自のデータセンターが必要です。 そのため、共有データベース(ログインのためにすべてのユーザーの資格情報を保存する)と複数のデータベース共有スキーマ(アカウント/会社ごとのデータベース)を作成することにしました。基本的に、マルチテナント。 次に、誰かが代わりにマルチインスタンスを使用することを提案しました。そこでは、各会社が他の会社から完全に分離されたアプリケーションの独自のインスタンス(つまり、コード、ライブラリ、データベース、フレームワークなど)を持ちます。これは、各テナントのユーザーが会社のデータにのみアクセスできることを確認する必要がある追加のレイヤーを処理する必要がないため、より良いように聞こえます。私がこのアプローチを達成するためにDockerに依存していることを言及するのは良いことだと思います(私は以前にそれを使用したことがありません)が、機能が不足していると思います(詳細は後で説明します)将来必要になるでしょう(少なくとも私はしませんでした)少し検索しても見つかりません)。 ただし、どちらのアプローチにも長所と短所があるため、どちらのアプローチを選択するか決定できませんでした。ここにリストがありますが、両方の知識が不足しているので、私にはわかりません。私が知らないことや、Webで見つけられなかった問題の解決策がある可能性があります。[各アプローチには私が1つずつ比較した順序付けられたリスト] マルチテナンシー: 共有ホスト/ハードウェア、共有コード、およびマルチデータベース。 それはだ簡単にコードと修正のバグの機能(共有コード)を拡張します。 ハードウェアを拡張する(クラウドサービスを使用できる)か、コードに変更を加えずに個々のテナントのデータベースを別のシステムに移動するのは困難です。 最も重要なことは、前述したように、ユーザーが実際に自分の会社に属していて、他の会社の情報にアクセスしていないことを確認するために、システムに追加のレイヤーを追加する必要があります。 マルチインスタンス: 共有または非共有のホスト/ハードウェア、インスタンスごとのコード、インスタンスごとのデータベース。 それはだ難しく(あなたは1つのインスタンスまたはドッカーコンテナに機能/機能を追加し、他の人にそれを展開することができドッカーでそれを行う方法がある場合、私はわからない)機能や修正のバグを拡張します。 それはだ簡単に別のホスト/ハードウェアに全体のインスタンスを移動すること。 インスタンスとして、各インスタンスは独自のデータベースを持っているので、そのレイヤーを処理する必要はありません。 (各テナントのインスタンスを手動で作成するなどして)手動で何かを実行したい場合は、長所と短所のすべてが冗長であり、それがDockerソリューションを疑う理由です。質問の理由。解決策を参照して質問に答えていただければ幸いです。なぜこのアプローチが他のアプローチよりも優れていると思いますか。 それが役立つ場合(多分?)、バックエンド(すべてRESTful)のメインフレームワークとしてLaravelを使用しています。


4
クラス重複パターン?
私は現在、現在のプロジェクトでソロ開発者として働いています。私は別の開発者からプロジェクトを引き継ぎました。これは、C#のモデルビューコントローラースタイルのWebアプリケーションです。オブジェクトリレーショナルマッピングにEntity Frameworkを使用します。また、ドメインモデルの型には、2つの異なるクラスセットがあります。1つのセットはORMとの対話に使用され、もう1つのセットはMVCシステムのモデルとして使用されます。たとえば、次の2つのクラスがあるとします。 public class Order{ int ID{get;set;} String Customer{get;set;} DateTime DeliveryDate{get;set;} String Description{get;set;} } そして public class OrderModel{ String Customer{get;set;} DateTime DeliveryDate{get;set;} String Description{get;set;} public OrderModel( Order from){ this.Customer= from.Customer; // copy all the properties over individually } public Order ToOrder(){ Order result =new Order(); result.Customer = this.Customer; // copy …

5
文字列を返す関数、良いスタイル?
私のCプログラムでは、ADTの文字列表現を作成する方法が必要になることがよくあります。文字列を画面に出力する必要がない場合でも、このようなデバッグ方法があると便利です。そのため、この種の機能がよく出てきます。 char * mytype_to_string( const mytype_t *t ); 文字列が返すメモリを処理するために、ここには(少なくとも)3つのオプションがあることを実感しています。 代替方法1:関数の静的文字配列に戻り文字列を格納します。文字列がすべての呼び出しで上書きされることを除いて、私はあまり考える必要はありません。これは、場合によっては問題になることがあります。 代替方法2:関数内のmallocを使用して、ヒープに文字列を割り当てます。バッファのサイズや上書きについて考える必要がないので、本当にすてきです。ただし、完了したら文字列をfree()することを忘れないでください。また、解放できるように一時変数に割り当てる必要もあります。ヒープ割り当てはスタック割り当てよりもはるかに遅いため、これがループで繰り返されるとボトルネックになります。 代替方法3:ポインタをバッファに渡し、呼び出し側にそのバッファを割り当てさせます。お気に入り: char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen ); これにより、発信者により多くの労力がかかります。この代替案では、引数の順序に関する別のオプションが提供されることにも気づきました。最初と最後のどちらの引数が必要ですか?(実際には6つの可能性) それで、どちらを選ぶべきですか?なんで?Cの開発者の間には、ある種の未記述の標準がありますか?

3
大きなリストを破棄すると、スタックがオーバーフローしますか?
次の単一リンクリストの実装を検討してください。 struct node { std::unique_ptr<node> next; ComplicatedDestructorClass data; } 次に、std::unique_ptr<node> headスコープ外になり、デストラクタが呼び出されるインスタンスの使用を停止するとします。 これは十分に大きなリストのスタックを爆破しますか?それは公正なコンパイラが(インラインかなり複雑な最適化を行いますと仮定することであるunique_ptr「内のデストラクタをnode私がしなければ以来、以下の(はるかに困難になっている、そして、s」は末尾再帰を使用)dataデストラクタがわかりにくくなりnext、のハードそれを作りますコンパイラーが再配列の可能性と末尾呼び出しの機会に気付くように) struct node { std::shared_ptr<node> next; ComplicatedDestructorClass data; } dataどういうわけかnodeそれへのポインタがある場合、それはテール再帰が不可能であることさえあるかもしれません(もちろん、私たちはそのようなカプセル化の違反を回避するよう努めるべきです)。 一般的に、そうでない場合、このリストを破棄するにはどうすればよいですか?共有ポインタにはrelease!がないため、リストを走査して「現在の」ノードを削除することはできません。唯一の方法は、カスタムの削除ツールを使用することです。


8
有益な例外とクリーンなコードのバランスをとる良い方法は何ですか?
公開SDKでは、例外が発生する理由について非常に有益なメッセージを提供する傾向があります。例えば: if (interfaceInstance == null) { string errMsg = string.Format( "Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.", ParameterInfo.Name, ParameterInfo.ParameterType, typeof(IParameter) ); throw new InvalidOperationException(errMsg); } ただし、コードが何をしているのかではなく、エラーメッセージに重点を置く傾向があるため、コードの流れが煩雑になる傾向があります。 同僚は、次のようなものにスローする例外の一部をリファクタリングし始めました: if (interfaceInstance == null) throw EmptyConstructor(); ... private Exception EmptyConstructor() …

1
Pythonランダムシャッフルの仕組み
Pythonでランダムからのシャッフルはどのように機能しますか? それは非常に速く動作するので私は尋ねます。シャッフルを書き込もうとすると、10 ^ 6要素で1分動作しますが、Pythonシャッフルは8秒で動作しますか?
11 python  random 

5
一連の操作に最適なOOP設計パターン
私はアプリケーションに取り組んでおり、そのモジュールは次の財務操作を順番に実行します。 ユーザーが特定の金額を自分の銀行口座に送金するように要求した場合: トランザクションが発生するかどうかを確認しますか?(一定期間のみ取引可能) ユーザーが最小金額の引き出しを要求しているかどうかを確認します ユーザーがデフォルトのアカウントを持っているかどうかを確認します 上記のすべてのアクションの結果がログに記録されます。 上記の条件をすべて満たしている場合、トランザクションが実行されます。将来的には、いくつかのチェックが追加される可能性があります。 上記のケースに最適なオブジェクト指向のデザインパターンはどれですか。

3
Gitでのテストブランチの使用
新しい機能とバグ修正のテストを担当する人(Tedと呼ぶことにします)がいます。 GitとGitHubを使用しています。master常に展開可能である必要developmentがあり、新しい機能やバグ修正をコミット/マージする場所ですが、Tedによってテストされた後でなければなりません。 プロジェクトはPHPにあります。 テストプロセスは次のようにします。 開発者は新機能(課題追跡に記載されているTedとしての機能/バグ#123としましょう)に取り組みたいので、ローカルリポジトリにプルorigin/developmentし、そこからdevelopment新しいブランチ(としましょうissue-123)を作成します。 作業に満足したら、新しいブランチをコミットしてにプッシュしoriginます。 Tedは接続しtest.ourproject.com/choose-branchてブランチのリストを確認し、originスイッチをオンにしますissue-123(Webページから実行できます)。その後、彼はに進みtest.ourproject.com、Webアプリケーションの地獄をテストし(彼は本当に無慈悲です)、開発者と何度かやり取りした後、彼は機能に満足しています。 テッドは、彼がマージすることができ、開発者告げるissue-123上にdevelopment上をorigin。 すすぎ、繰り返します。 3番目のステップでは、その仕事(特定のページからの分岐の表示と切り替え)をハッキングすることができますが、ここで説明したことは非常に一般的なパターンだと感じています。 だから私の質問は: これは分岐のための良い/持続可能な/保守可能なワークフローですか?このワークフローに従う他のプロジェクトの例をいくつか挙げて、回答を裏付けることができますか?

4
SaaSアプリでのユーザーセッションタイムアウトの処理-いくつかのアプローチの説明
これは重複としてマークされる可能性が高いことを知っていますが、探しているものを正確に見つけることができませんでした これは一般的な問題であり、明確に定義されたベストプラクティスソリューションがあるはずです。 バックグラウンド 単一ページのSaaSアプリ、ドラッグアンドドロップがたくさんあり、ユーザーは一定期間サーバー通信がなくてもアプリを操作できます サーバーセッションは、非永続的なセッションCookieを使用して、ユーザーオブジェクトのみを保持します X時間後にサーバーでセッションが期限切れになる ログイン時にのみ読み込まれるもの 問題 ユーザーはアプリで作業し、完了してもログアウトせず、ブラウザーを開いたままにします ユーザーがX時間を超えて戻ってきた(セッションがサーバーで無効になっている) ユーザーはサーバー接続を必要とせずにアプリと対話します(ドラッグアンドドロップ、テキスト編集など) 次のサーバーとの対話時のみ(自動保存がないと仮定)、ユーザーはログインページにスローされ、一部の作業が失われます 可能な解決策 私が考えているいくつかの解決策があります。他に解決策があるかどうか、そして根本的に何か問題があるかどうかを聞きたいです。 1.ユーザーをログアウトしないでください どうやって?長いセッションを維持する、永続的なcookieを維持する、またはjavaScriptの「キープアライブ」ping 長所:ユーザーは何も心配する必要がなく、問題を修正します 短所:PCIに準拠せず、安全ではなく、開発の変更が必要です。たとえば、ユーザーのログイン時にのみセッションに読み込まれるものは、pubサブモデル(イベントの変更をリッスンする)に移動するか、キャッシュタイムアウトを持つ必要があります。 2.ローカルストレージ どうやって?ログアウトした場合、新しいローカルストレージを使用して状態を一時的に保存し、ログインページにリダイレクトし、ログイン後も保持する 長所:セッションタイムアウトの処理だけでなく、「オフライン作業」サポートのベース 短所:実装が難しく、データツリーの状態マージを行う必要がある、すべてのブラウザがサポートするわけではない 3.自動保存 モデルを変更するすべてのユーザーアクションは、すぐに(またはクライアント側のキューを介して)永続化する必要があります。たとえば、ユーザーがチェックボックスをオンにしたり、テキストフィールドを変更したり、何かをドラッグアンドドロップしたりすると、変更が永続化されます。 どうやって?MV **フレームワーク(Backbone.js / Knockout.js / Ember.js / Angular.jsなど)を使用してモデルをバインドし、変更を維持します。 長所:クリーンなソリューションのようです。ユーザーがアクティブである限りセッションはアクティブであり、永続化せずにクライアント側の作業は行われません。 短所:セッションタイムアウトが失われた後、ユーザーが最後に行ったアクション。 4.セッションの有効期限が切れた後、ユーザーをログアウトします これにはいくつかのアプローチがあります サーバーに「セッションの期限が切れています」と尋ねます。これは、サーバーへの単なる質問がセッションを延長する(タイムアウトを再開する)ため、ちょっとしたキャッチ22 /シュレディンガーの猫です。 どうやって?そのような質問をサポートするサーバーを持っているか(私は知りませんが、Javaランドから来ます)、またはセッションIDのテーブルと最終アクセス時間を手動で保持し、セッションを渡すことによってサーバーに問い合わせることができますCookieの代わりにパラメーターとしてIDを使用します。これが可能かどうかはわかりませんが、危険で、安全でなく、設計が間違っているようです。 長所:サーバーにそのようなネイティブサポートがあった場合、クリーンで正当な質問のように聞こえます(ユーザーXがまだセッションを持っているかどうかを尋ねます) 短所:サーバーがそれをサポートしていない場合(そして、サーバーやフレームワークにこの機能があるかどうかはわかりません)、回避策には潜在的に大きなセキュリティリスクがあります。 私が聞いた1つの回避策は、サーバー側での短いセッションと、最大数のpingを持つキープアライブクライアント側のpingです。 どうやって?サーバー上の短いセッション、クライアントはすべてのsessionTimeOut / 2にpingを実行し、最大再試行回数はYです。 長所:問題の修正の種類、迅速で汚い 短所:サーバーに任せるのではなく、自分でセッションの更新を処理するハックのように感じる クライアント側タイマー どうやって?クライアント側にタイマーを設定し、すべてのリクエストで再起動してサーバーのタイマーと同期させ、最大サーバーセッションタイムアウトからパディングを差し引いた値に等しくします。ユーザーがサーバーにリクエストを送信していない後、UIに「セッションは間もなくタイムアウトします。続けますか?」(あなたがオンラインバンキングに持っているように) 長所:問題を修正します …


2
使用するmakeスレッドはいくつありますか?
デスクトップ/ラップトップコンピューターで大規模なシステムを(再)ビルドするとき、次のようmakeに、複数のスレッドを使用してコンパイル速度を上げるように指示します。 $ make -j$[ $K * $C ] どこ$Cの数を示すことになっているコアながら、マシンが持っている(私たちは一桁と番号であることを仮定することができ)$K、私は異なるものだ2と4、私の気分に応じました。 したがって、たとえば、make -j124つのコアがある場合、make最大12のスレッドを使用するように指示することができます。 私の理論的根拠は、私が$Cスレッドのみを使用する場合、プロセスがドライブからデータをフェッチするのにビジーである間、コアはアイドルになるということです。しかし、スレッドの数を制限しない場合(つまりmake -j)、コンテキストの切り替えに時間を浪費したり、メモリを使い果たしたり、さらに悪いことにリスクを冒したりします。マシンに$Mギグのメモリがあると仮定しましょう($Mは10のオーダーです)。 したがって、実行するスレッドの最も効率的な数を選択するための確立された戦略があるかどうか疑問に思っていました。

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