ソフトウェア工学

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

4
Cのファイルスコープの「静的」変数は「extern」グローバル変数と同じくらい悪いのですか?
staticCでは、C ++でプライベートクラスメンバー変数を使用する場合に、(スタイルの問題として)ファイルスコープ変数を使用することがよくあります。マルチスレッドプログラムにスケーリングする場合thread_localは、C11または長くサポートされている拡張機能を追加__threadするだけで十分です。私はあなたが内部のすべてを置くことによってC ++とCで正確に同じことを行うことができます知っているstructし、それへのポインタをとる関数のセット作りstruct、その最初の引数としてを。一部のライブラリは、これを広範囲にわたって実行します。しかし、私の個人的なスタイルはstruct、必要に応じて、できるだけ小さくすることです。 「グローバル」変数が非常に悪いと主張する人々をよく読んだり聞いたりします。私はそれらの理由を追っていますが、彼らの議論のほとんどはexternC用語のグローバル変数に関連しているようです。彼らの言うことは確かに真実です。extern宣言された変数の1つまたは2つをプログラム全体で使用すると、処理が大幅に簡略化され、追跡が容易になる場合がありますが、さらに先に進むとプログラムが予測不可能になります。 何についてのstatic変数?彼らはまだ「実際の」グローバル変数と同じ問題を抱えていますか?多分私はこの質問をして私がしていることが正しいと思うなら続ける必要さえないかもしれませんが、今日私は別の「グローバル変数は悪い」種類の投稿を見た、そしておそらくこれはおそらく正しいとここに来ましたそのような質問のための場所。あなたの考えは何ですか? この質問はの重複ではありません。このこの質問はについて尋ねているためexternとstatic他の質問は、ファイル・スコープとブロックスコープについてです一方、非ローカル変数static変数。
8 c  globals 

3
主キーにハッシュを使用することは良い考えですか?
オーストリアの電子IDカードは、いわゆるセクタ識別子に依存しています。たとえば、病院では、大まかに次のように計算される、その人のセクターIDを取得することで、その人を識別できます。 sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant それは良い考えですか?どんなに小さくても、衝突の可能性は危険だと思います。 ハッシュテーブルでは、衝突が発生した場合、同等性を確立する別の方法がありますが、主キーでは、同一の2つを使用することはできません。これは複合キーで回避できますが、一意のセクター識別子のポイントが失われます。 それをしても大丈夫ですか、それがいつか壊れることなくそのようにする方法はありますか?

1
グループ化アルゴリズム
一部の労働者とその居住地のチェックイン時間に応じて、それらをいくつかの車両にグループ化する方法と、車両を職場まで運ぶために車両が従わなければならないルートを計算するアルゴリズムを開発しました。これは、TSP(Travelling Salesman Problem)アルゴリズムとその他のカスタマイズを使用して実現されています。 私たちはそれを超えて改善したいと考えています。とりあえず、車両の定員は4人(5か所ですが、1人は運転席)に固定されており、この量を「可変」にしたいと考えています。言い換えれば、メインアルゴリズムを実行する前に、必要になる可能性のある車両の組み合わせ(およびそのフリーシート)を決定する必要があります。私が車両について話すとき、私は車両の種類について話します。たとえば、車両Aは4席、車両Bは7席などです。つまり、5席のAudi A8を1つ、5席の座席Ibiza、20席のバスを1つ持つことについて話しているのではありません。 これまでのところ、私が考えたのは次のとおりです。 労働者のグループを決定します。 必要な車両の数とその(無料)座席を決定します。それがその質問で私が尋ねているものです[a]。 ユーザーは優先する組み合わせを選択して続行します。 車両の組み合わせを使用してすでに開発されているアルゴリズムを適用し、それが実現可能なソリューションに到達するかどうかを確認します。 私の質問は、[a]アルゴリズムを開発する方法です。次の例は、[a]の実行結果を示しています。 次の人々が4、7、10シートの車両にグループ化するとします。 [a]の実行後、結果は次のようになります。 G3(2人の労働者):4席の空き車両1台(空席の多い車両は破棄されます)。 G2(2人の労働者):4席の空き車両1台(空席の多い車両は破棄されます)。 G1(9人の労働者): オプションA:4座席の3台の車両。 オプションB:4人乗りの車両1台と7台の車両1台。 オプションC:7台の2台の車両。 オプションD:10席の車両1台。 私は近似を考えました: 車両のタイプを作成し、それらをソートされたリストに追加します(ソート基準は座席でなければなりません)。 労働者のグループごとに、以下を実行します。 組み合わせを計算します[b]。 画面に結果を印刷します。 したがって、主な問題は、[b]の開発方法です。 助言がありますか?私が自分自身をひどく説明した場合は申し訳ありません。

2
オプション機能:デフォルトのメソッドまたは分離されたインターフェース
専用インターフェースは、ドメイン固有のタイプ階層でオプション機能を公開するための良い方法のようです。ただし、これらはデコレータおよび複合パターンの使用を妨げます。これは、この種の階層でも一般的です。 特に、おそらくこれらのインターフェイスの可能な組み合わせごとにデコレータ/コンポジットを実装する必要はないでしょう。そのため、多くの場合、すべてのオプションのインターフェイスを実装し、型チェックを使用して呼び出しを選択的に転送します。これにより、インターフェイスを分離する目的が損なわれます。 Javaコレクションフレームワークが使用する別の方法は、すべての操作を基本型に含め、それらをダミーの実装で埋めることです。Java 8のデフォルトメソッドは、この使用をさらに容易にします。 ある意味で、これは、データベースの世界では、null許容列の議論のように感じられます。より実用的な後者のアプローチに対して強い議論はありますか?

3
独自の例外を作成する必要がありますか、それともわずかに非標準的な目的で同様の例外を選択する必要がありますか?
これは一般的なデザインの質問ですが、私がC#と.NETに焦点を合わせています。これは、これらが現在使用している言語だからです。 独自の新しい例外クラスを作成する必要がありますか、それともわずかに異なる目的で既存のフレームワーク例外を選択する必要がありますか? たとえば、メンバ(つまり、型など)が予期されていたが、を使用してアセンブリを読み取っているときに見つからなかったことを示す例外が必要であることがわかりましたMono.Cecil。基本クラスライブラリは例外を定義しますMissingMemberException。これは、私が欲しいものを正確に伝えているようですが、説明では次のように述べています。 存在しないクラスメンバーに動的にアクセスしようとした場合にスローされる例外。 メンバーに動的にアクセスするのではなく、アセンブリを受動的に操作するため、これは正確には適合しません。


1
懸念の分離の維持
私は最初のC#アプリを作成していますが、問題の分離に少し問題があります。コンセプトは理解していますが、正しくやっているのかわかりません。私の質問を説明する簡単な例としてこれを持っています。ゲームなどのアプリには、プログラムやゲームなどのメインループを実行するメインクラスがあります。私の質問は、このクラスのクラスのすべてのインスタンスへのすべての参照を維持し、それがそれらが相互作用する唯一の方法にすることですか? たとえば、プレーヤー、カード、ボードを使用したカードゲームです。プレーヤーがカードをボードに置きたいが、PlayerクラスにはカードのList <>しかなく、ゲームボードについて何もわからないとしましょう。ただし、メインのGameクラスは、プレーヤー、カード、およびゲームボードについて知っています。ボードにカードを配置するのがゲームクラス次第なのか、それとも、プレーヤーのアクションであるため、それはプレーヤークラス内にあるべきであるということの方が理にかなっています。 例: public class Game{ private GameBoard gameBoard; private Player[] players; public Game(){ gameBoard = new GameBoard(10,10); Player player1 = new Player(); Player player2 = new Player(); players = {player1, player2}; } // Create method here? public void PlayerPlaceCard(int x, int y, int cardIndex){ gameBoard.grid[1,1] = player1.cards[cardIndex]; } …
8 design 

4
Cの未定義の動作がいつ因果関係の壁を跳んだのか
一部のハイパーモダンCコンパイラは、特定の入力が与えられたときにプログラムが未定義の動作を呼び出す場合、そのような入力は決して受信されないと推測します。その結果、そのような入力が受信されない限り無関係であるコードは排除される可能性があります。 簡単な例として、 void foo(uint32_t); uint32_t rotateleft(uint_t value, uint32_t amount) { return (value << amount) | (value >> (32-amount)); } uint32_t blah(uint32_t x, uint32_t y) { if (y != 0) foo(y); return rotateleft(x,y); } コンパイラは、の評価が0のvalue >> (32-amount)場合に未定義の動作を生成するためamount、関数が0でblah呼び出されることはないと推測yします。fooしたがって、呼び出しは無条件にすることができます。 私が言うことができることから、この哲学は2010年頃にいつか定着したようです。そのルーツについて私が見た最も初期の証拠は2009年に遡り、未定義の動作が発生した場合に明示的に述べているC11標準に安置されていますプログラムの実行のある時点で、プログラム全体の動作が遡って定義されなくなります。 コンパイラは、IEで未定義の動作(逆因果最適化を正当化するために未定義の動作を使用することを試みるべきであるという考えたrotateleft機能がそれを前提とするコンパイラを起こすべきではblah非ゼロと呼ばれている必要がありますy何が今まで引き起こすかどうか、yにゼロ以外の値を保持する)2009年より前に真剣に提唱されましたか?最適化手法として最初に真剣に提案されたのはいつですか。 [補遺] 一部のコンパイラには、20世紀でさえ、ループとその中で計算された値に関する特定の種類の推論を有効にするオプションが含まれています。たとえば、 int i; int total=0; for (i=n; i>=0; i--) { doSomething(); …

4
アジャイルスクラム/かんばんチームの適切なテスト戦略は何ですか?
問題は: 私が働いているチームは、開発者が10人、テスターが2人という比率です。つまり、「テスト」よりも早くコードを作成することになります。 では、アジャイルの専門家によると、このようなシナリオでの活動を追跡するための正しいアプローチは何でしょうか? 以前のスプリントで「完了」と呼ばれるもの(テストは行われていません)がたくさんあるときに、近いうちにその日が来るのではないかと心配しています。 努力をシームレスに追跡するにはどうすればよいですか?テストは「完了定義」の一部である必要がありますか?そうでない場合の落とし穴は何ですか? 私によると、実際に機能テストされる前にストーリーを「完了」と呼んでいるので、これは一種の「ウォーターフォール」です。
8 testing  agile 

3
関数が新しいポインタを返すことを示す標準的な方法はありますか?
クラスが所有するオブジェクトの構築を別の関数に委任したい場合があります。何かのようなもの Vertex* new_vertex(const Options& options) { // do stuff... return new Vertex(...); } この関数は、を所有するクラス内でのみ使用することを目的としていVertexます。明らかに、この関数はメモリリークを引き起こす混乱を引き起こす可能性があるため、できるだけ明確にしたいと思います。そのような関数の命名規則はありますか?

2
ORMで複雑な計算フィールドを処理する方法
私たちのAPIには、計算された値を持つデータベースから取得した後に(いわば)「装飾」する必要があるいくつかの中心的なデータ型があります。データベースは、CakePHP 3データベースレイヤーから大きく影響を受けたテーブル/エンティティダイナミックに従うORMを介してアクセスされます。テーブルオブジェクトは、データベースと、モデルオブジェクトインスタンスとして行を取り込んで渡すアプリケーションとの間の仲介として使用されます。したがって、データベースからデータを取得してそれらの行を返すだけでなく、返されたデータを実際に使用する前に前処理する必要があります。ここに私が何を意味するかをよりよく説明するために出てきたいくつかのユースケースがあります: オブジェクトには数値があり、ユーザーフレンドリーなラベルに変換されます(通常、これは純粋にクライアントに保持するロジックですが、ビジネスセキュリティ上の理由から、このデータの一部はサーバーにのみ保持する必要があります。エッジケース) オブジェクトには、最後に追加された評価から取得された関連する評価値が必要です このような計算値と保存された値の組み合わせに基づいて、複雑なスケジュールオブジェクトが構築されます 単独では、これらのいずれもmap()、返された結果セットに対する単純な操作で実際にかなり簡単に実行できます。同じことが複数の計算値が必要な場合にも当てはまります。必要に応じて、より多くのマップ操作を実行して、それらのフィールドを計算および追加できます。 とはいえ、このアプローチには2つの大きな欠点があります。 これは、これらの計算された値を操作するすべての場所で後処理の追加の手順を実行する必要があることを意味します。これは特にDRYではありません。 これらの変換の一部は、最初に実行される他の変換に依存しています。それ以外の場合は、操作できるデータがありません。 両方を処理するために、このコードをORMに移動し、ORMを変更して、インターフェイスが(外部で)データベース列を処理するのと同じ方法で計算された仮想フィールドにアクセスできるようにするのが最善のアプローチであると考えていました。内部的には、これらの仮想フィールドを変換関数にマップし、潜在的に必要な依存関係変換を内部的に決定して、2番目の問題を解決することができます。 (余談ですが、これにより、単純なハッシュではなく、返された行が実際のオブジェクトである必要がなくなるかどうか疑問に思っています。現在、各行は、フィールドデータセットが設定された新しいオブジェクトをインスタンス化しますが、すべての計算またはデータの変更はモデルの外に移動され、オブジェクトはプロパティのバッグになります-本質的に、それ自体の内部ロジックを持たないハッシュマップです。これは実際には悪いことではないかもしれません)


1
ソース管理された環境でのコード署名の処理
簡単な質問ですが、うまくいけば: 私のチームは、ClickOnce配置を使用し、証明書で署名されたソフトウェアを管理しています。署名のみに使用される別のマシンで実際に使用される公開証明書を保持します。それはうまくいきます。 ただし、問題が時折発生するのは、誰かがソリューションを構築してテストできるように、誰かが新しいテスト証明書でローカルに署名する必要がある場合です。必然的に、この新しい証明書のフィンガープリントは、プロジェクト設定ファイルの一部としてバージョン管理にプッシュされます。独自の証明書設定がGitサーバーにプッシュされることはないため、署名ボックスで問題が発生することはなく、そのマシンからのプルによってローカルの変更が上書きされることはありません。ただし、ローカルマシンで使用される独自のテスト証明書を持っているため、他のすべての人に問題が発生します。 この状況を処理する正しい方法はありますか?おそらく、Gitで変更を全体ではなく構成ファイルの特定の部分のみから除外する方法があるでしょうか?
8 git 

1
C#を使用してクロスプラットフォームアプリケーション(MacおよびWindows)を作成できますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 この質問に関する多くの古い情報とInterwebsの周りを飛んでいる多くの記事を見ていますが、物事がどこにあるのかははっきりとわかりません。 基本的に、ネイティブのWindowsアプリケーションにコンパイルしたり、ネイティブのMacアプリケーション(ParallelsやWineなど)にコンパイルしたりできるC#コードを記述したいと思います。これはできますか? Xamarinのような製品は進むべき道ですか?XamarinのWebサイトでは、「同じ言語、API、データ構造を使用して、すべてのモバイル開発プラットフォームで平均75%のアプリコードを共有しています」と述べています。しかし、プラットフォーム固有の25%のアプリコードが何を必要とするのかはわかりません。また、OSXとWindowsをターゲットにしているのかどうかもわかりません。彼らのWebサイトはモバイルデバイス中心です。 [後で追加] 概要:Xamarinはクロスプラットフォームアプリケーションを作成するようには設計されていません。MacaのGUI操作を使用して、C#でMacアプリケーションを作成する方法が提供されます。彼らが推奨するのは、すべての「ビジネスロジック」クロスプラットフォームを記述してから、2つの完全に別個のGUIを記述することです。1つはWindows用、もう1つはMac用です。 C#/ Qtは非常に初期の段階にあるようです(2016年以降にこの記事を誰かが見つけた場合は、チェックしてください)。 monoはGUIを含むクロスプラットフォームを実行するようですが、Windowsフォームを使用する場合のみです。

2
大規模なルックアップテーブルによるユニットテスト?
私たちのシステムは、計算やその他のロジックの多くの重要な情報をルックアップタイプテーブルから取得できるように構成されています。例としては、すべての種類の異なるレート(金利や拠出率など)、日付(有効日など)、およびすべての種類のさまざまなその他の情報があります。 なぜ彼らはすべてをこのように構成することに決めたのですか?この情報の一部はかなり頻繁に変更されるためです。たとえば、料金の一部は毎年変動します。彼らは、コードの変更を最小限に抑えることを試みました。期待は、ルックアップテーブルが変更され、コードが機能することだけです(コードの変更はありません)。 残念ながら、それは単体テストを困難にするだろうと思います。一部のロジックでは、100以上の異なるルックアップが行われる場合があります。私は間違いなく私たちのレートを返すモック可能なオブジェクトを作ることができますが、かなりのセットアップになるでしょう。私はそれか、統合テストを使用する(そしてそのデータベースにアクセスする)必要があると思います。私は正しいですか、それとももっと良い方法がありますか?助言がありますか? 編集: 応答が遅れて申し訳ありませんが、私は同じことで他の多くのものをジャグリングしながら、すべてを浸そうとしました。また、実装を同時に実行したいと思いました。私はさまざまなパターンを試して、満足できる解決策を構築しました。満足できないビジターパターンを試してみました。結局、私はオニオンアーキテクチャを使用することになりました。結果に満足しましたか?ちょっと。それが何かだと思います。ルックアップテーブルを使用すると、はるかに困難になります。 以下は、毎年変化するレートのテスト用のセットアップコードの小さな例です(imはfakeiteasyを使用しています)。 private void CreateStubsForCrsOS39Int() { CreateMacIntStub(0, 1.00000m); CreateMacIntStub(1, 1.03000m); CreateMacIntStub(2, 1.06090m); CreateMacIntStub(3, 1.09273m); CreateMacIntStub(4, 1.12551m); CreateMacIntStub(5, 1.15928m); CreateMacIntStub(6, 1.19406m); CreateMacIntStub(7, 1.22988m); CreateMacIntStub(8, 1.26678m); CreateMacIntStub(9, 1.30478m); CreateMacIntStub(10, 1.34392m); CreateMacIntStub(11, 1.38424m); CreateMacIntStub(12, 1.42577m); CreateMacIntStub(13, 1.46854m); CreateMacIntStub(14, 1.51260m); CreateMacIntStub(15, 1.55798m); CreateMacIntStub(16, 1.60472m); CreateMacIntStub(17, 1.65286m); CreateMacIntStub(18, 1.70245m); CreateMacIntStub(19, 1.75352m); …

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