ソフトウェア工学

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

6
列挙型はコードの匂いではありませんか?
ジレンマ オブジェクト指向の実践に関するベストプラクティスの本をたくさん読んでいますが、読んだ本のほとんどすべてに、enumはコードの匂いだと言う部分がありました。列挙型が有効な場合に説明する部分を見逃したと思います。 そのように、私を探していますガイドラインおよび/またはユースケースの列挙型がありませ有効な構文コードのにおいと、実際に。 ソース: 「警告経験則として、列挙型はコードの匂いであり、多態性クラスにリファクタリングする必要があります。[8]」Seemann、Mark 、. 342 [8] Martin Fowler et al。、Refactoring:Improving the Design of Existing Code(New York:Addison-Wesley、1999)、82。 環境 私のジレンマの原因は取引APIです。このメソッドを介して送信することにより、Tickデータのストリームを提供します。 void TickPrice(TickType tickType, double value) どこ enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... } 変更を壊すことがこのAPIの生き方であるため、このAPIのラッパーを作成しようとしました。ラッパーで最後に受信した各ティックタイプの値を追跡したいので、ダニタイプのディクショナリを使用してそれを行いました。 Dictionary<TickType,double> LastValues 私には、キーとして使用される場合、これは列挙型の適切な使用のように思えました。しかし、私はこのコレクションに基づいて意思決定を行う場所があり、switchステートメントを排除する方法を考えることができないため、工場を使用できますが、その工場にはまだどこかにswitchステートメント。私はただ物事を動かしているように見えましたが、まだ匂いがします。 列挙型のDO N'Tを見つけるのは簡単ですが、DOはそれほど簡単ではありません。人々が自分の専門知識、長所と短所を共有できるなら、私はそれを感謝します。 考え直し 一部の決定とアクションはこれらに基づいておりTickType、enum / switchステートメントを削除する方法を考えることはできないようです。私が考えることができる最もクリーンなソリューションは、ファクトリを使用し、に基づいて実装を返すことTickTypeです。それでも、インターフェイスの実装を返すswitchステートメントがあります。 以下は、間違った列挙型を使用しているのではないかと疑っているサンプルクラスの1つです。 public class ExecutionSimulator { …

4
クライアント側とサーバー側の検証を1か所で管理する
私は間違いなくそうすべき ケースで100%乗っています、クライアント側とサーバー側の両方のデータ検証使用するます。 しかし、私が働いてきたフレームワークと環境では、私が見たアプローチは決して乾いたことはありませんでした。ほとんどの場合、計画やパターンはありません。検証はモデルの仕様に記述され、検証はビューのフォームに記述されます。(注:私の実際の経験のほとんどは、Rails、Sinatra、およびjQueryを使用したPHPに関するものです) それを熟考すると、検証のセット(モデル名、フィールド、条件など)が与えられると、必要なクライアント側とサーバー側の両方のマテリアルを生成できるジェネレーターを作成することは難しくないようです。あるいは、そのようなツールはサーバー側の検証(たとえば、validates ActiveRecordモデルのコード取得し、クライアント側の検証(フォームに適用されるjQueryプラグインなど)を生成できます。 明らかに、上記は単なる「このアイデアを思いついた」という考えであり、正式な提案ではありません。この種のことは、アイデアが思いついたときよりも確かに難しいです。 それで、データ検証のための「1回だけ書き込み、サーバーとクライアントで実行する」技術の設計にどのようにアプローチしますか? 関連サブトピック:特定のフレームワークまたはクライアント/サーバーテクノロジーには、そのようなツールが存在しますか?1セットの検証のみを維持しようとする場合の大きな落とし穴や課題は何ですか?

4
テスト:決定論的または非決定論的?
どちらかを持っている方が良いですか 同じテストが成功する確定的なテストスイート 非決定的テストスイート。これは、より多くのケースをカバーする可能性があります。 ? 例: テストスイートを作成して、MVCアプリケーションのコントローラー機能をテストします。コントローラーは、テスト中の入力としてデータベースからのアプリケーションデータを必要とします。これを行うには2つのオプションがあります。 テストデータベースのどの行を入力として選択するかをハードコーディングします(10行目と412行目など) 乱数ジェネレーターを使用して、データベースからデータを擬似ランダムに選択します(乱数ジェネレーターによって選択された2行) 1つ目は決定論的です。同じリビジョンのコードに対してテストを実行するたびに、同じ結果が得られます。2番目は非決定的です。テストスイートを実行するたびに、異なる結果が得られる可能性があります。ただし、ランダムに選択されたデータは、データエッジケースのより適切な表現である可能性があります。予測不可能なデータをコントローラーに送るユーザーをよりよくシミュレートするかもしれません。 どちらか一方を選択する理由は何ですか?
17 testing  mvc 

5
TDDで、本番コードを変更せずに合格するテストケースを作成した場合、それはどういう意味ですか?
これらは、TDDに関するRobert C. Martinの規則です。 失敗した単体テストに合格しない限り、実稼働コードを作成することはできません。 失敗するのに十分な数以上の単体テストを作成することはできません。コンパイルの失敗は失敗です。 1つの単体テストに合格するのに十分な量を超える量産コードを記述することはできません。 価値があると思われるが、本番コードを変更せずに合格するテストを作成する場合: それは何か間違ったことをしたということですか? 役立つ場合は、将来そのようなテストを書くことを避けるべきですか? そのテストをそこに残すか、削除する必要がありますか? 注: 私はここでこの質問をしようとしていました:ユニットテストに合格することから始められますか? しかし、私は今まで十分に質問を明確にすることができませんでした。

9
レコードステータス(保留、完了、ドラフト、キャンセルなど)を保存する方法
多くのアプリケーションでは、テーブルのレコードに「完了」、「ドラフト」、「キャンセル」などのステータスを設定する必要があります。これらのステータスを保存する最良の方法は何ですか?私がここで得ているものを説明するのは、*非常に短い)例です。 簡単なブログアプリケーションがあり、各投稿のステータスは、公開済み、下書き、保留中のいずれかです。 私がそれを見る方法は、データベースでこれをモデル化する2つの方法があります。 Postテーブルには、ステータステキストを含むテキストフィールドがあります。 Postテーブルには、PostStatusテーブル内のレコードのIDを含むステータスフィールドがあります ここのブログの例は、非常に単純な例です。列挙型(サポートされている場合)で十分な場合があります。ただし、ステータスのリストはいつでも変更される可能性があることを考慮に入れて、質問への回答が欲しいので、追加または削除できます。 誰もがそれぞれの長所/短所を説明できますか? 乾杯! これに関する私の最初の選択は、別のテーブルを使用し、正規化に適しているとステータスを調べる方が良いことです。正規化はデータベースに適しているといつも教えられてきました

5
メッセージキュー。データベースと専用MQ
メッセージのキューイングに関するアドバイスを求めています。「ジョブ」をメッセージキューに投稿する必要があります。 最初の提案は、SQL Serverインスタンスを使用して、そこからのメッセージを処理することだけでした。インターネットで読んだことはすべて、Message Queueにデータベースを使用することはスケーラブルなソリューションではないことを示唆しています。このため、RabbitMQまたは他のサードパーティMQを使用するというアイデアが提案されました。 もう1つ考慮すべきことは、「ジョブ処理」の要件が30秒以上にならないことです。したがって、ジョブを実行するプロセスは30秒ごとにデータベースをポーリングします。私には、これはそれほど悪くはないようで、おそらくデータベースに大きな負荷をかけなくても大丈夫でしょう。 クライアントに必要な追加サポートを追加しないように、これに使用できるデータベースが既にクライアントに配置されていますが、サードパーティMQを追加した場合、ネットワーク構成などの追加サポートがあります。多くのユーザーがいることを考えると、かなりの数です。 私が検討していたもう1つのオプションは、ユーザーがどちらかを選択できるようにすることでした。小さいユーザーの場合、SQL Serverソリューションは問題ありませんが、大きいユーザーの場合、サードパーティのMQソリューションを構成できます。 私はソリューションで販売されていません。誰かが私が考慮すべきことやアドバイスを持っているかどうか疑問に思っています。

1
単体テストと統合テストを分離する必要がありますか?
プロジェクトの単体テストと統合テストを作成する必要があります。 すべてのテストを単一のテストフォルダーに入れる必要がありますか? または、単体テストと統合テストをそれぞれ個別のテストフォルダーに配置する必要がありますか? それとも、それらを別々のプロジェクトに入れるべきですか? それらをまとめると、このアプローチには利点や欠点がありますか?

3
いずれかのオーバー(チェック済み)例外を使用する理由
少し前に、Javaの代わりにScalaを使い始めました。私にとって言語間の「変換」プロセスの一部は、Either(チェックされた)Exceptions の代わりにs を使用することを学ぶことでした。私はしばらくこの方法でコーディングしてきましたが、最近、それが本当に良い方法かどうか疑問に思い始めました。 1つの大きな利点Eitherは、Exceptionパフォーマンスの向上です。Exceptionスタックトレースを構築する必要があり、スローされています。ただし、私が理解している限りでは、投げることExceptionは難しい部分ではありませんが、スタックトレースを構築することは重要です。 しかし、その後、常にを使用してExceptionsを構築/継承することができます。scala.util.control.NoStackTraceさらにEither、実際にはの左側が実際にException(パフォーマンスブーストを控える)であるケースがたくさんあります。 もう1つの利点Eitherは、コンパイラの安全性です。ScalaコンパイラExceptionは、(Javaのコンパイラとは異なり)ハンドルされていないs について文句を言いません。しかし、私が間違っていなければ、この決定は、このトピックで議論されているのと同じ推論で推論されます。 構文の面では、Exception-styleの方がはるかに明確だと感じています。次のコードブロックを調べます(どちらも同じ機能を実現しています)。 Either スタイル: def compute(): Either[String, Int] = { val aEither: Either[String, String] = if (someCondition) Right("good") else Left("bad") val bEithers: Iterable[Either[String, Int]] = someSeq.map { item => if (someCondition(item)) Right(item.toInt) else Left("bad") } for { a <- aEither.right bs <- reduce(bEithers).right ignore …

5
MongoDBをいつ使用する必要がありますか?
MongoDBは、非常に使いやすいことがわかっているNoSQLデータベースです。最近、HTTPリクエストを使用していくつかのデータを収集し、データの処理後に結果を保存する必要のある簡単なアプリケーションを開発する必要があり、MongoDBを使用してみました。 この経験から、私は従来のリレーショナルデータベースよりもはるかに使いやすく、DBAではなく開発者であるため、作業が大幅に簡素化されました。 それでも、SQL ServerやMySQLのような従来のリレーショナルデータベースの代わりにMongoDBをいつ使用すべきかわからないことがあります。 その場合、リレーショナルデータベースの代わりにMongoDBを使用できるのはいつですか?MongoDBに関して、状況によっては不適切となる、非常に大きな警告がありますか?

3
GDBはどのように実行を一時停止しますか
ご存知かもしれませんが、GDBを使用してコードにブレークポイントを設定し、デバッグのために実行を一時停止できます。 私の質問は、GDBがプロセスをどのように一時停止しi r、たとえばレジスタを使用してレジスタの内容を表示できるかです。これらのレジスタは、他のOSプロセスで常に使用されていませんか?どうして上書きされないのですか? ライブデータではなく、コンテンツのスナップショットだけですか?
16 c++  debugging 


2
C ++メソッドを、ポインター引数を持つC関数に変換することは受け入れ可能なパターンですか?
ESP-32でC ++を使用しています。タイマーを登録するとき、私はこれをしなければなりません: timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback); timer_args.arg = this; ここでタイマーが呼び出しますsoundCallback。 タスクを登録するときも同じこと: xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle); そのため、メソッドは個別のタスクで開始されます。 GCCは常にこれらの変換について警告しますが、計画どおりに機能します。 量産コードでは受け入れられますか?これを行うためのより良い方法はありますか?
16 c++  c  functions 

1
.NETソリューションのディレクトリ構造
最近、請負業者を訪問し、プロジェクトの構造化の方法論について質問しました。特にディレクトリ構造について言及していることに注意してください。彼は、Microsoftのガイドラインを使用することを提案しました。「Microsoftガイドライン.NETプロジェクトのディレクトリ構造」をGoogleで検索して、何か役立つものを見つけることができると思いましたが、そうではないことが判明しました。現状では、次のようなことをしています。 [Company.System.Feature] |-doc |Sandcastle project |-lib |Nuget packages |-src |-Project1 e.g. web |-Project2 e.g. business logic |-UnittestProject1 |-Specs docフォルダーには、https://www.codeproject.com/Articles/15176/Sandcastle-Help-File-Builderで説明されているようなSandcastleソリューションが含まれています(絶対パスと相対パスを参照)。したがって、docフォルダーには、生成されたヘルプファイルを含むヘルプフォルダーが含まれます。libフォルダーには、すべてのNugetパッケージが含まれています。 ソリューションの構成方法を推奨するマイクロソフトのガイドラインはありますか?私はここを見ました:https : //stackoverflow.com/questions/789389/project-structure-for-c-sharp-development-effort/789554? noredirect=1 # comment86756309_789554 私が読んだ記事や質問のほとんどは2007年から2009年に作成されたようです。Nugetは2010年に導入されたと思います。Microsoftのガイドラインはありますか?:私は、しかし、これはもう存在していないようです、ツリー外科医と呼ばれるものについて読んhttps://archive.codeplex.com/?p=treesurgeon。 TFSを使用しています。クルーズコントロールとDDDは、それによって違いをもたらします。
16 c#  visual-studio 

4
共通フィールドを基本クラスに移動するタイミングは?
現在、2つの派生クラスがAあり、B、両方に共通のフィールドがあり、基本クラスに入れるかどうかを判断しようとしています。 基本クラスから参照されることはありません。また、道路のある時点で別のクラスが派生した場合C、を持たない場合、_field1「最低特権」(または何か)のプリンシパルは違反されませんだった? public abstract class Base { // Should _field1 be brought up to Base? //protected int Field1 { get; set; } } public class A : Base { private int _field1; } public class B : Base { private int _field1; } public class C : Base { // …

4
Java-完全に静的なクラスを持つことは悪い考えですか?
私は現在、より大きなソロプロジェクトに取り組んでおり、インスタンスを作成する理由がわからないクラスがいくつかあります。 たとえば、現在のダイスクラスはすべてのデータを静的に格納し、そのメソッドもすべて静的です。サイコロを転がして新しい値を取得したいときは、を使用するだけなので、初期化する必要はありませんDice.roll()。 私はこのような主な機能を1つだけ持っているいくつかの類似したクラスを持ち、すべてのイベントを担当する一種の「コントローラー」クラスで作業を開始しようとしています(プレイヤーが移動したとき、そうです)、このクラスでも同じ考えに従うことができることがわかりました。これらの特定のクラスに対して複数のオブジェクトを作成する予定はないので、それらを完全に静的にすることは悪い考えでしょうか? Javaに関しては、これが「悪い習慣」と見なされるのかと思っていました。私が見たものから、コミュニティはこのトピックに関して一種の分裂のように思われますか?とにかく、私はこれに関するいくつかの議論が大好きだし、リソースへのリンクも素晴らしいでしょう!

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