ソフトウェア工学

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

5
トップレベルドメイン(TLD)の理由
私はいつもTLDが存在し、ドメイン名を購入するときに考える必要があることを当たり前に思っています。しかし、なぜ彼らがそもそも存在しなければならないのか疑問に思っています。ドメインネームシステムを次のようにできなかった理由がわかりません。 https://twitter/foo/bar https://example/foo/bar つまり、.comやのようなTLDが存在する必要は本当にありません.org。それは恣意的なもののようです。この背後に歴史があるか、あるいはそれが必要かどうか知りたい。

3
オープンソースプロジェクトのクレジットに記載するように依頼する必要がありますか?
オープンソースプロジェクトでクレジットを付与する方法についていくつか投稿しましたが、私の質問を対象としたものはありません。 私は約1年前からオープンソースプロジェクトに取り組んでおり、私の最新版の1つには、(私の知る限り)どの言語でも完全に実装されていないものがあります。非常に人気のあるプロジェクトの著者が私の努力を称賛し、それらのアイデアをプロジェクトに実装し始めました。さて、アルゴリズムは完全に同じではありませんが、私の仕事の知識なしにそれらが実装できなかったことは確かです。実際、アルゴリズムをマシンコードにコンパイルした場合、アルゴリズムは〜95%同一であるとまでは言えます。 私のプロジェクトはそれほど人気が​​ないので、1か月あたりの再生回数は非常に少なく(100未満、通常は1日あたり1人のユニークユーザーしかいないため、主に私に起因します。つまり、私自身)、彼らがコメントした直後、そこで1日あたり100ビューを超え、2人のユニークユーザーがアクセスしました。その後まもなく、彼らは出版した...偶然...私はそうは思わない! 彼らはそれを公にリリースし、どこにも私の名前を(コメントでも)述べていません。私の一部は「誰が気にして、それはオープンソースであり、コミュニティは今より良い」のようですが、私の反対側は、「ちょっと待って、私が遭遇するすべての評判の良いプロジェクトは非常に信用されています。コミュニティにとってはるかに良いコミュニティです。」 だから私の質問は2つあります: 私はクレジットで言及を求めることさえ気にすべきですか? もしそうなら、どうすればいいですか? 編集:私は特定の経験を利用した答えを探しています。この質問とそれに続く回答は、同様の状況に遭遇し、かなりの量の作業を行い、他の専門家に関連する経験を見せたい将来のユーザーにとって有益であろうと思います。

4
C#でのコンストラクターの結果の確認
これと同様の方法で、nullのコンストラクターの結果をチェックする癖がある同僚とコードベースの作業をしています。 Person p = new Person(); if (p != null) { p.Name = "John Smith"; } .NETランドスケープについての私の理解は、例外がスローされない限り、コンストラクターは割り当てを満たされないままにしないということです。したがって、上記の場合、nullチェックは役に立ちません。いずれかpが割り当てられる、または例外は、プロパティセッターをスキップさせるスローされます。 ついでにこれについて同僚に尋ねたところ、「念のため」という言葉に沿って受動的な答えを得ました。私はこの種の「パロニアプログラミング」が好きではありません。読みやすさが損なわれ、不必要に循環的複雑度が増すと思います。このため、この行為の中止を正式に要請したいと思います。これは合理的な要求ですか?何か不足していますか?

2
アジャイルユーザーストーリーの共有開発タスク
私のチームは、次のプロジェクトでVisual Studio Team Servicesを使用します。アジャイルツールを使用すると、次のようにユーザーストーリーとタスクを階層的に整理できます。 エピック>機能>ユーザーストーリー>タスク/バグ 高校生とアドバイザーのためのStudent Org(クラブ)管理システムを設計しているとしましょう。学生とアドバイザーはクラブに参加したり、役員になったり、イベントを企画したり、お知らせを送信したりできます。 アナウンス機能を例に見てみましょう: ユーザーストーリー: 学生として、自分が所属しているクラブのお知らせを読んで、スケジュールの変更を認識したいと思っています。 アドバイザーとして、自分が所属しているクラブの告知を読んで、スケジュールの変更を認識したいと思っています。 アドバイザーとして、所属するクラブに通知を送信して、生徒がスケジュールの変更を認識できるようにしたい 管理者として、すべての学校のクラブにアナウンスを送信して、スケジュールの矛盾を認識させることができます。 等 これらが適切に記述されたユーザーストーリー(そうではない可能性があります)であると想定すると、開発チームとこれらの項目を開発タスクに分割するために座るときに混乱します。複数のユーザーストーリーの一部を単一の開発タスクでカバーできます。たとえば、お知らせのプロパティを定義するだけで、UIからDBまでのすべてのレイヤーのCRUDアクションを生成するツールがあります。したがって、いくつかの「送信」および「読み取り」ユーザーストーリーの部分は、単一の開発ステップで完了します。 私が読んだことから、各ユーザーストーリーは他のユーザーストーリーから独立している必要があり、それは理にかなっています。ただし、ユーザーストーリーのそれぞれが「UIとDBを生成する」タスクを共有しています。これは、この方法で(カスタマイズする前に)ベ​​ースレベルのUIを作成するためです。ユーザーストーリーごとに「UIとDBを生成する」タスクを書くべきではありません。冗長性が高すぎます。しかし、ユーザーストーリーを開始する前に完了する必要がある「UIとDBを生成する」タスクの記述方法がわかりません。 私の許可システムにも同様の混乱があります。Student、Adviser、Adminなどのさまざまなアカウントタイプがあり、すべて[お知らせ]ページにアクセスできますが、ページ内の機能は異なります(このアイデアは上記のユーザーストーリーでキャプチャしました)。アクセス許可システムを他の機能で使用できるようにモジュール化することもできますが、「モジュール化されたアクセス許可システム」を作成するタスクをどこに書き込むかわかりません。 このユーザーストーリー全体が混乱しているようです。はい、それはシステムの機能をキャプチャするのに最適ですが、開発タスクを通して考えるとなると、私はそれに頭を抱えているようには見えません。どんなアドバイスでもいいでしょう。 TL; DR:あるユーザーストーリーで行うプログラミングの一部は、他のユーザーストーリー(アクセス許可システムなど)のプロジェクトの他の場所で使用できます。この可能性を説明するために、ユーザーストーリーのタスクを作成/整理するにはどうすればよいですか?

2
ソース管理における機密情報のベストプラクティス
このトピックはかなり取り上げられていますが、自分の特定の状況に対する答えを見つけることができません。 現在、私は.gitignore機密コンテンツを除外し、それ(構成ファイルなど)を個別に保持するために使用しています。私のコードベースがますます多くのプロジェクトに拡大するにつれて、これは管理が非常に難しくなり、変更を追跡したり、ファイルを適切にバックアップしたりする実際の方法もありません。 そこにこの問題のためのいくつかのツールのような、ではないgit-secret、Hashicorp Vaultとgit-crypt私は(さまざまな理由のために)私の開発のすべてを行うのWindows、これらの作品のどれも。 現在、私は自社内で作業する唯一の開発者であり、拡張する予定はありません。ソース管理(Gitlab)は、主に自分の参照と変更を記録する機能に使用されます。いくつかの接続文字列または構成ファイルをソース管理にプッシュすることは、大きな問題またはリスクになるでしょうか?その情報は現在、セキュリティで保護されていないネットワークドライブにあります(NTFSアクセス許可を除く) 私は、ベストプラクティスはこのようなものをソース管理にプッシュすることではないという考えを得ますが、ローカルネットワークの外部ではアクセスできないプライベートにホストされたGitlabインスタンスがあります-これはリスクが少ないことを意味しますか?
8 git  security 

6
再利用された例外タイプは、使い捨てのものよりも優先されるべきですか?
Doorが管理しているsがあるとしDoorServiceます。DoorServiceデータベースに格納されているドアを開く閉じてロックを担当しています。 public interface DoorService { void open(Door door) throws DoorLockedException, DoorAlreadyOpenedException; void close(Door door) throws DoorAlreadyClosedException; /** * Closes the door if open */ void lock(Door door) throws DoorAlreadyLockedException; } lockメソッドにはがありDoorAlreadyLockedException、openメソッドにはがありDoorLockedExceptionます。これはオプションですが、他にも可能なオプションがあります。 1)DoorLockedExceptionすべてに使用すると、lock()通話で例外をキャッチするときに少し面倒です try { doorService.lock(myDoor); } catch(DoorLockedException ex) // door ALREADY locked { //error handling... } 2)2つの例外タイプがDoorLockedExceptionあり、DoorAlreadyLockedException 3)2つの例外タイプがありますが、 DoorAlreadyLockedException extends …

2
ゼロ引数コンストラクターと常に有効なエンティティ
私は最近、Always Validドメインエンティティについて多くの読書をしました。エンティティが常に有効であることを保証するために、私は次のことを行う必要があると信じるようになりました。 1)ここで説明されているように、プリミティブな強迫観念を取り除き、値オブジェクトコンストラクターに検証/ドメインルールを配置します:https : //enterprisecraftsmanship.com/2016/09/13/validation-and-ddd/。2)ここで説明されているように、検証またはドメインルールをエンティティまたはプロパティセッターのコンストラクタに配置します:http ://gorodinski.com/blog/2012/05/19/validation-in-domain-driven-design-ddd/ 。 ただし、次に、https://github.com/gregoryyoung/mrなどのいくつかのオープンソースプロジェクトを調べます。私が理解していることから、このプロジェクトの作成者は常に有効なドメインモデルの擁護者ですが、それでもInventoryItemクラス(https://github.com/gregoryyoung/mr/blob/master/SimpleCQRS/Domain.cs)を調べます。私はこれを行うことができることに気づきました: InventoryItem inventoryItem = new InventoryItem(); またはこれ: InventoryItem inventoryItem2 = new InventoryItem(Guid.Empty,null); 私の考えでは、これはエンティティが無効な状態で初期化されることを意味します。これは、私が最近見た他のすべてのオープンソースプロジェクトにも当てはまるようです。たとえば、次のプロジェクトです。https://github.com/dcomartin/DDD-CQRS-ES-Example/blob/master/src/Domain /Customer.cs。 これらのオープンソースプロジェクト(https://martinfowler.com/bliki/ContextualValidation.html)にコンテキスト検証があることに気づきました。また、ドメインモデルにマップする場合、ORMにはデフォルトの空のコンストラクターが必要であることも理解しています。 ドメインオブジェクトは、引数なしのコンストラクタを使用してデフォルト値で初期化されている/空/ null値で初期化されている場合、有効な状態ですか?

2
言語設計では1つの数値タイプのみ
私は現在、コンパイラの構築と言語設計について学び、自分の言語でサポートしたいネイティブデータ型について考えています。現在、整数と実数を区別する多くの言語があります。しかし、私は彼が言ったダグラス・クロックフォードによる講演を見たのを覚えています。 システムに単一の数値タイプがあることは、間違った数値タイプを選択してバグを発生させることができないことを意味します 彼はまた、一般的に使用されているIEEE-754とは異なる数値表現をお勧めします(間違っている場合は修正してください)。したがって、私の質問:主に教育に重点を置いている汎用言語の場合、どの数値表現を使用する必要がありますか? 編集:教育的焦点を当てて、私は他の人を教育するためではなく、コンパイラについて学ぶ私の自身の進歩について話しています。

5
関数ベースのRESTful APIの設計
私と友達の間で議論を解決してください。 現在、製品APIを設計しています。製品エンティティは次のようになります { "Id": "", "ProductName": "", "StockQuantity": 0 } 製品の販売はサードパーティが処理し、StockQuantityフィールドを減らすことができるように購入数量を通知する義務があります。 私のアプローチ: PUT /api/Product/{Id}/ --data { "StockQuantity": "{NewStockQuantity}" } サードパーティは、製品のクエリ、現在のStockQuantity購入数量に基づく計算、およびPUT新しい値でのリクエストの送信を担当します。 私の友人はサードパーティに計算を望まない。彼のアプローチ PUT /api/Product/{Id}/DecreaseStock --data { "PurchasedQuantity": "{PurchasedQuantity}" } したがって、計算を行って、 StockQuantity 私は関数ベースのエンドポイントを作成したくありません、そして彼は計算を行うためにサードパーティを信頼したくありません。 この問題に取り組むための正しい方法は何でしょうか?

4
あなた自身のクラスのための拡張メソッドをいつ書くべきですか?
私は最近、Addressどこかに、次に別の場所で定義されたデータクラスを持つコードベースを見ました。 fun Address.toAnschrift() = let { address -> Anschrift().apply { // mapping code here... } } このメソッドをアドレスに直接指定しないと混乱を招きました。拡張メソッドを使用するときに確立されたパターンまたはベストプラクティスはありますか?それとも、その本はまだ書かれている必要がありますか? この例のKotlin構文にも関わらず、C#またはそれらの機能を備えた他の言語にも適用されるので、一般的なベストプラクティスに興味があることに注意してください。
8 c#  design 

5
「純粋な関数」ではなく、外部APIまたはハードウェアと相互作用するメソッドは静的である必要がありますか?
メソッドを静的にするかどうかについて読んだとき、この投稿で要約されているように、メソッドは状態を変更せず、結果がそれ。ただし、この投稿で最も投票数の多い回答には、可能な限り静的メソッドを使用する必要があると記載されています。この投稿の回答の多くは、最も論理的なことは何でもすべきだと言っています。 私の場合、複数の場所で使用され、どのモデルまたはビューモデル(C#MVVMを使用)のメンバーとしても意味がないため、共通のユーティリティクラスに〜15のメソッドがあります。パッケージを使用してさまざまなハードウェアコンポーネントと対話するvoidメソッドがあります(たとえば、National Instruments、OPCクライアントなど)。一部の入力を取得し、APIに対してGETまたはPUTを実行してから応答を返すメソッドもあります。これらのメソッドはHttpClientまたは類似のものを使用します。これらのメソッドは、のような入力に対する単純な演算子ではなくMath.Sqrt()、状態を変更しません。 それで、そのようなメソッド(そしてこの場合、クラス全体)は静的でなければなりませんか?静的メソッドを持つ静的クラスがあることには明らかな利点があります。オブジェクトを作成する必要がないため、安全で高速です。また、これらの静的メソッドはそれぞれ、APIとハードウェアの相互作用のためにより多くの静的メソッドとクラスを使用します。私が目にする唯一の欠点は、TypeMock Isolatorのような有料のフレームワークで単体テストを書かなければならないことです。TypeMock Isolatorなどの有料サービスを使用してモックを作成するのが答えである場合、コストは問題になりません。コンセンサスであればそれで結構です。新しい開発者を獲得したり、プロジェクトが成長したりするときに、適切にスケーリングし、技術的な負債をほとんど残さない決定をしたいだけです。 これをより明確にするためにさらに情報を提供する必要があるかどうかをお知らせください!

2
「進化的ソフトウェアアーキテクチャ」は矛盾ですか?
私の理解では、進化的アーキテクチャは、アーキテクチャを簡単に変更できるようにすることです。現在、アーキテクチャーは多くの場合、後で変更するのが難しいため、早期に正しく取得する必要があるものとして定義されています。 これはどのように組み合わされますか?進化的アーキテクチャとアーキテクチャの量を最小限に抑えることの間に違いはありますか?

2
Liskovの置換の原則:サブタイプに、型には存在しない追加の動作が実装されている場合、このLSPの違反ですか?
私はより良く、よりクリーンなコードを書くために、SOLIDの原則について学んでいます。この点で、LSPは適切に把握するのが少し難しいことがわかっています。 私の疑問は、サブタイプSに余分なメソッドがあり、タイプTになかった場合、これは常にLSPの違反になるのでしょうか?はいの場合、どのようにextend私のクラスを行うのですか? たとえば、Birdタイプがあるとしましょう。そして、そのサブタイプはEagleおよびHumming Birdです。現在、両方のサブタイプには、としていくつかの共通の動作がありBirdます。しかし、Eagle(一般的なBirdタイプには存在しない)優れた略奪行動もあるので、それを使用したい。したがって、今はこれを行うことができません: Bird bird = new Eagle(); それで、Eagleそれらの追加の振る舞いを与えることはLSPを壊していますか? はいの場合、それはLSP違反を引き起こすため、クラスを拡張できないことを意味しますか? class Eagle extends Bird { //we are extending Bird since Eagle has some extra behavior also } クラスの拡張は、Open / Closed原則に従って許可する必要がありますか? よろしくお願いします!はっきりとわかるように、LSPは私を他のものと同じように混乱させています。 編集:このSOの回答を参照してください。この場合Carも、のような追加の動作がある場合ChangeGear、LSPに違反します。では、LSPに違反せずにクラスを拡張するにはどうすればよいでしょうか。

2
MixinとTraitの違いは何ですか?
ScalaとHackからわかることから ミックスイン: 状態を持つことができます(つまり、インスタンスプロパティ) 具体的な方法しか提供できない クラスが混合されたのと同じ順序で呼び出されるコンストラクターを持つことができます もしA混合物中BとC、A instanceof B == falseそしてA instanceof C == false 特徴: メソッドのみを提供でき、状態は提供できません コンシューマが実装する必要がある抽象メソッドを宣言できます コンストラクタを持つことはできません AトレイトBとを実装する場合C、A instanceof B == falseおよびA instanceof C == false これは正しいですか、または何か不足していますか?これらの定義は、任意のOO言語に対して正確ですか、それとも上記の言語に対してのみ正確ですか?

7
ネストされたループ内から「続行」するためのベストプラクティスは?
これは簡略化されたサンプルです。基本的に、文字列リストから文字列をチェックします。チェックにパスすると、その文字列(filterStringOut(i);)が削除され、他のチェックを続行する必要がなくなります。したがってcontinue、次の文字列に。 void ParsingTools::filterStrings(QStringList &sl) { /* Filter string list */ QString s; for (int i=0; i<sl.length(); i++) { s = sl.at(i); // Improper length, remove if (s.length() != m_Length) { filterStringOut(i); continue; // Once removed, can move on to the next string } // Lacks a substring, remove for (int …

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