ソフトウェア工学

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

10
GUIDを主キーとして使用する
通常、データベースの主キーとして自動インクリメントIDを使用します。GUIDを使用する利点を学ぼうとしています。私はこの記事を読みました:https : //betterexplained.com/articles/the-quick-guide-to-guids/ これらのGUIDは、アプリケーションレベルでオブジェクトを識別するために使用されることを理解しています。データベースレベルでプライマリキーとしても保存されますか。たとえば、次のクラスがあったとします: public class Person { public GUID ID; public string Name; .. //Person Methods follow } メモリ内に新しい人物を作成し、その人物をデータベースに挿入したいとします。これをやってもいいですか: Person p1 = new Person(); p1.ID=GUID.NewGUID(); PersonRepository.Insert(p1); GUIDを主キーとする数百万の行を含むデータベースがあったとします。これは常に一意ですか?GUIDを正しく理解していますか? 以前にこの記事を読んだ:http : //enterprisecraftsmanship.com/2014/11/15/cqs-with-database-generated-ids/。GUIDと整数の間の幸せな媒体を主キーとして推奨するように見えるので、少し混乱します。 編集11/06/18 Guidsはintよりも自分の要件に適していると信じるようになりました。私は最近CQRSをより多く使用しており、GUIDはよりうまく適合しています。 一部の開発者は、GUIDをドメインモデルの文字列としてモデル化することに注意してください。例:https : //github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/ Buyer.cs-この場合:IdentityGuidは文字列としてモデル化されたGUIDです。ここに記載されていること以外にこれを行う理由はありますか?カスタム値オブジェクトまたはGUIDを分散システムのエンティティ識別子として使用しますか?。GUIDを文字列としてモデル化するのは「通常」ですか、それともモデルとデータベースでGUIDとしてモデル化する必要がありますか?

5
実装をリークすることなく、内部ベクトルの反復を許可します
人々のリストを表すクラスがあります。 class AddressBook { public: AddressBook(); private: std::vector<People> people; } クライアントが人々のベクトルを反復処理できるようにします。私が持っていた最初の考えは単純でした: std::vector<People> & getPeople { return people; } しかしながら、 実装の詳細をクライアントに漏らしたくありません。ベクトルが変更されたときに特定の不変式を維持したい場合があり、実装をリークするとこれらの不変式に対する制御が失われます。 内部をリークすることなく反復を許可する最良の方法は何ですか?
32 c++ 

2
適切なデザインパターンの選択
デザインパターンを活用することの重要性は常に認識しています。他の開発者がどのように最も適切な開発者を選ぶかについて興味があります。決定に役立つ一連の特性(フローチャートなど)を使用していますか? 例えば: オブジェクトは関連しているが、具象クラスを指定したくない場合は、Abstractを検討してください インスタンス化が派生クラスに委ねられている場合は、Factoryを検討してください 集合オブジェクトの要素に順番にアクセスする必要がある場合は、Iteratorを試してください または何か似たような?

6
どのクラスをSpringによって自動配線する必要がありますか(依存性注入を使用する場合)?
しばらくの間、SpringでDependency Injectionを使用してきましたが、それがどのように機能し、それを使用することの長所と短所を理解しています。しかし、新しいクラスを作成するとき、よく疑問に思う-このクラスはSpring IOC Containerによって管理されるべきか? また、@ Autowiredアノテーション、XML構成、セッターインジェクション、コンストラクターインジェクションなどの違いについては説明しません。私の質問は一般的なものです。 コンバーター付きのサービスがあるとしましょう: @Service public class Service { @Autowired private Repository repository; @Autowired private Converter converter; public List<CarDto> getAllCars() { List<Car> cars = repository.findAll(); return converter.mapToDto(cars); } } @Component public class Converter { public CarDto mapToDto(List<Car> cars) { return new ArrayList<CarDto>(); // do the mapping here …

3
パブリックAPIで(列挙)型を表現する方法
私は自分のクライアントに使用し、将来一般に公開したいシンプルなAPIに取り組んでいます。異なる「タイプ」を持つことができる「アイテム」オブジェクトがあります。型はCの「typedef enum」です。 typedef enum { ItemTypeBool, ItemTypeNumber, ItemTypeDate, } ItemType; (将来、いくつか追加するかもしれません) 整数として転送するのか、定義された「文字列」として転送するのかを考えています。JSONは次のようになります。 整数の場合: { "name": "The name", "type": 0, ... } 文字列の場合: { "name": "The name" "type": "boolean" ... } これにベストプラクティスがあるかどうか疑問に思っています。整数を保持すると、コードが若干単純化され、帯域幅が削減されますが、開発者は文字列を覚えやすくなります。私はプロジェクトに取り組んだことを思い出し、1 = image、2 = audio、3 = htmlを思い出さなければなりませんでした。 あなたが私が考慮すべき他の側面を知っているなら、私はあなたに尋ねています。


5
C#とJavaが参照の等価性を「==」のデフォルトとして使用するのはなぜですか?
私はしばらくの間、JavaとC#(および他の言語)がデフォルトでの等価性を参照する理由を熟考してきました==。 私が行うプログラミング(確かにプログラミングの問題のごく一部にすぎません)では、オブジェクトを比較するとき、参照の等価性ではなく、論理的な等価性がほとんど常に必要です。私は、これらの言語の両方が、==論理的な平等性を持ち.ReferenceEquals()、参照の平等性を使用するのではなく、このルートを採用した理由を考えようとしました。 明らかに、参照の等価性を使用することは実装が非常に簡単で、非常に一貫した動作を提供しますが、今日見られるほとんどのプログラミング手法にうまく適合するとは思えません。 論理比較を実装しようとすることの問題について無知に思われたくはありません。また、すべてのクラスで実装する必要があります。また、これらの言語はかなり前に設計されたものであることに気づきましたが、一般的な疑問が残っています。 これにデフォルトを設定することの大きな利点はありますか、それとも単にデフォルトの動作が論理的等価であるべきであり、クラスに論理的等価性が存在しない場合に参照の等価性にデフォルト設定することは妥当と思われますか?

7
クラスを使用したOOPと比較した関数型プログラミング
私は最近、関数型プログラミングの概念のいくつかに興味を持っています。しばらくの間、OOPを使用しました。OOPでかなり複雑なアプリを作成する方法を見ることができます。各オブジェクトは、そのオブジェクトが行うことを行う方法を知っています。または、親クラスでも同様です。だから私は単にPerson().speak()人に話させるように言うことができます。 しかし、関数型プログラミングで同様のことを行うにはどうすればよいですか?関数がどのようにファーストクラスのアイテムであるかがわかります。しかし、その機能は特定の1つのことだけを行います。私は単にsay()周りに浮かぶメソッドを持ち、それを同等のPerson()引数で呼び出すので、何か言っていることを知っていますか? だから私は簡単なことを見ることができます、機能プログラミングでOOPとオブジェクトの比較をどのように行うのですか?それで、コードベースをモジュール化して整理できますか? 参考までに、OOPでの私の主な経験は、Python、PHP、およびいくつかのC#です。私が見ている機能的な機能を持つ言語は、ScalaとHaskellです。私はScalaに傾いていますが。 基本的な例(Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: {0}'.format(what)) Cat(Animal): def say(self, what): super().say('cat meows: {0}'.format(what)) dog = Dog() cat = Cat() dog.say('ruff') cat.say('purr')


4
抽象データ型とデータ構造
これらの用語を理解することは私にとって非常に困難です。私はグーグルで検索し、ウィキペディアで少し読みましたが、まだわかりません。私はこれまでのところ以下を決定しました: 抽象データ型は新しい型の定義であり、そのプロパティと操作を説明します。 データ構造は、ADTの実装です。多くのADTは、同じデータ構造として実装できます。 私が正しいと思うなら、ADTとしての配列は、要素のコレクションを意味し、データ構造として、それがメモリにどのように保存されるかを意味します。スタックはプッシュ、ポップ操作を備えたADTですが、アルゴリズムで配列として実装されたスタックを使用した場合、スタックデータ構造について言えますか?そして、なぜヒープはADTではないのですか?ツリーまたは配列として実装できます。

8
変数に小さいデータ型を使用してメモリを節約するのは良い習慣ですか?
C ++言語を初めて学んだとき、int、floatなどに加えて、これらのデータ型のより小さいバージョンまたは大きいバージョンが言語内に存在することを知りました。たとえば、変数xを呼び出すことができます int x; or short int x; 主な違いは、short intは2バイトのメモリを使用し、intは4バイトを使用し、short intの値は小さいことですが、これを呼び出してさらに小さくすることもできます。 int x; short int x; unsigned short int x; さらに制限されています。 ここでの私の質問は、プログラム内で変数が取る値に応じて別々のデータ型を使用するのが良い方法かどうかです。これらのデータ型に従って変数を常に宣言することは良い考えですか?

9
リファクタリングするタイミング
ファウラーのリファクタリングの本のほとんどを読み、過去の大小の多くのアプリケーションをリファクタリングしました。 私が教えるのが難しいのは、「いつ」リファクタリングするかです。私は過去に非常によく役立ってきた腸の感覚に基づいてこれを行う傾向があります。ただし、コードをそのままにするかリファクタリングするかについて人々と議論するとき、「ガットチェック」に耐えることは困難です。 もっと厳密なアプローチが必要だと感じていますが、それが何であるかはわかりません。 私は「コード臭」、赤緑リファクタリング、その他の考えを理解していますが、リファクタリングに最適なのは、コードを最初に書くのではなく、コードを使用して2回目または3回目にすることですそれは実際に問題であり、実際に使用されていることです。

7
データベース上の文字列/レコードの非常に大きなリストをすばやく検索する方法
次の問題があります:200万件を超えるレコードを含むデータベースがあります。各レコードには文字列フィールドXがあり、フィールドXに特定の文字列が含まれるレコードのリストを表示します。各レコードのサイズは約500バイトです。 より具体的にするために、アプリケーションのGUIには、文字列を入力できるテキストフィールドがあります。テキストフィールドの上に、テキストフィールドの文字列に一致する(最初のN、たとえば100)レコードを表示するテーブルがあります。テキストフィールドに1文字入力または削除すると、テーブルの内容をその場で更新する必要があります。 適切なインデックス構造やキャッシュを使用してこれを行う効率的な方法があるのだろうか。上記で説明したように、クエリに一致する最初のN個のアイテムのみを表示します。したがって、Nが十分に小さい場合、データベースから一致するアイテムをロードすることは大きな問題ではありません。さらに、アイテムをメインメモリにキャッシュすると、検索が高速になります。 主な問題は、パターン文字列を指定して、一致するアイテムをすばやく見つける方法だと思います。DBMSの機能に依存することはできますか、それともインメモリインデックスを自分で構築する必要がありますか?何か案は? 編集 私は最初の実験を実行しました。レコードを異なるテキストファイルに分割し(ファイルあたり最大200レコード)、ファイルを異なるディレクトリに配置しました(1つのデータフィールドの内容を使用してディレクトリツリーを決定しました)。最終的に、約40000個のディレクトリに約50000個のファイルが作成されます。次に、Luceneを実行してファイルのインデックスを作成しました。Luceneデモプログラムを使用した文字列の検索は非常に高速です。分割とインデックス作成には数分かかりました。これは、クエリしたい静的なデータセットであるため、私にはまったく受け入れられます。 次のステップでは、Luceneをメインプログラムに統合し、Luceneから返されたヒットを使用して、関連するレコードをメインメモリにロードします。

5
JavaScriptのモジュール性、サーバーベースのMVCおよびビジネスリアリティ
これは非常に広範な質問であることを理解していますが、この問題のさまざまな側面を個別に扱っており、すべての概念と技術をまとめるのに苦労しています。 答えには次のテクノロジーを含めるように指定したいと思います。 C# MVC 3 w / Razor Javascript w / jQuery それ以上のもの(Backbone.js、Entity Frameworkなど)は、次の質問への回答に役立つ場合、提案として歓迎します。 上記のテクノロジーを使用して、スケーラビリティとリッチで高速でクリーンなUIを作成する能力を維持しながら、コードとロジックを整理するための最適な戦略は何ですか? 理想的には、ビジネス/企業環境で展開されているソリューションに焦点を当てるべきです。その際、上記の技術リストは変更されないため、「現在使用しているyyyの代わりにxxxを使用する必要があります」というソリューションを提供しないでください。 バックグラウンド 私は毎日jQueryを使用しており、ASP.NETのMVCを採用しており、C#で長い間作業しています。そのため、これらのテクノロジーに関する中級から上級の知識を前提としたソリューションを提示できます。 質問をより小さな部分に整理して、より簡単に回答できるようにします。 1.プロジェクトの構造 ASP.NET MVC(Visual Studio 2010)で作業していることを考えると、このタイプのアプリケーションのメインレイアウトをある程度受け入れられるディレクトリ構造ソリューションが必要です。ブランチのようなものだと思いますが、各フォルダーに含まれる内容と、アプリの他の領域との連携についてもう少し詳しく説明します。 2.データアクセス APIタイプの構造で、できる限りデータアクセスをモジュール化したいと思います。あなたはPOCOオブジェクト(多くの仮定することができUser、UserGroup、Customer、OrderHeader、OrderDetails、など)だけでなく、データ集約型SQLと慎重なUIのレンダリングを必要とするいくつかの複雑なレポートがあるでしょう。 EF + LINQは前者にとっては素晴らしいですが、後者にとってはそれほどではありません。私は、両方のシナリオに適合すると思われるものを、過度に複雑または過度に単純にすることなく見つけられません。 3.クライアント側のコード編成とUIレンダリング ほとんどの開発者が最初にjQueryを採用したように、どこに行く必要があるとしてもコードをまとめ上げるというtrapに陥りましたが、すぐにそれが積み重なってくなりました。以来、飛躍的に進歩していますが、コードを繰り返し実行せずにコードをモジュール化し、UIのさまざまな部分を操作するのに苦労しています。 例として、私が書くかもしれない典型的なコードは次のようになります。気になることはコメントしました(それ以降、遅延AJAX呼び出しの使用に変更し、実際のデータ要求をDOM操作から分離していることに注意してください): $('#doSomethingDangerous').click(function () { // maybe confirm something first if (confirm('Are you sure you want to do this?')) { …

19
実際のアプリケーションでは、128ビットのフラットアドレス空間が必要になりますか?
これは少し「1メガバイトあれば誰でも十分」ということですが、... 64ビットのフラットアドレス空間は、32ビットのアドレス空間よりも最大43億倍のスペースを許可します。これは17,179,869,184 GiBです。 明らかに、8ビットから16ビットへの移行は非常に迅速でした(80年代の10代で物事を表示していますが、これらのメインフレームとミニはすべて、エリートのポートを実行できなかったため無視しています)。16ビットから32ビットへの移行には少し時間がかかり、実際には32ビットがかなり長く続きました。 64ビットになりましたが、「17,179,869,184 GiBで誰にでも十分」と言うのは愚かでしょうか? プログラミングの観点を本当に念頭に置いているので、これはプログラマーの質問です。いつかコンピューターに一見無限の作業メモリーがあるように見えても、それはアプリケーションが一見無限のフラットなアドレス空間を見る必要があるという意味ではありません。 基本的に、プログラマーは安reliefのため息をついて「まあ、少なくとも整数や浮動小数点数が何であれ、少なくともポインターが成長することを心配する必要はない」と言うことができますか?

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