ソフトウェア工学

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

7
アプリケーション層vsドメイン層?
私はEvansによるドメイン駆動設計を読んでおり、階層アーキテクチャについて議論している部分にいます。アプリケーション層とドメイン層は異なり、別々にする必要があることに気付きました。私が取り組んでいるプロジェクトでは、それらは混ざり合っており、本を読むまで違いを伝えることはできません(そして、今では私にとって非常に明確だとは言えません)。 私の質問は、どちらもアプリケーションのロジックに関するものであり、技術的側面とプレゼンテーションの側面はきれいであると想定されているため、これら2つの境界線を引くことの利点は何ですか?

11
非同期と同期の意味[非公開]
コンピューターサイエンスの非同期と同期という言葉の意味は何ですか? 単語の意味をグーグルで検索すると、次のものが得られます。 非同期:存在しないか、同時に発生しません。 同期:既存または同時に発生します。 しかし、プログラミングやコンピューターサイエンスで反対の意味を伝えるために使用されているようです。 HTML非同期属性は、HTMLがまだ解析中またはダウンロード中であっても、ダウンロードされるとすぐにスクリプトが実行されることを意味します。つまり、スクリプトとHTMLの両方のプロセスが存在し、同時に発生します。 これらの用語は、コンピューターサイエンスで反対の意味を伝えるために使用されていますか、それとも私がポイントを逃していますか?

3
なぜスタックを後方に拡張するのですか?
Cコードをコンパイルしてアセンブリを見ると、スタックは次のように後方に成長します。 _main: pushq %rbp movl $5, -4(%rbp) popq %rbp ret -4(%rbp)-これは、ベースポインタまたはスタックポインタが実際にメモリアドレスを上に移動する代わりに下に移動することを意味しますか?何故ですか? に変更$5, -4(%rbp)し$5, +4(%rbp)、コンパイルしてコードを実行しましたが、エラーはありませんでした。では、なぜメモリスタックをさかのぼる必要があるのでしょうか?
46 c  memory  assembly 

7
呼び出しスタックに静的な最大サイズがあるのはなぜですか?
いくつかのプログラミング言語で作業してきたので、必要に応じて自動的に拡張するのではなく、スレッドスタックが事前に定義された最大サイズを持っている理由を常に疑問に思っていました。 それに比べて、ほとんどのプログラミング言語に見られる特定の非常に一般的な高レベル構造(リスト、マップなど)は、必要に応じて成長するように設計されていますが、新しい要素が追加され、利用可能なメモリまたは計算の制限によってサイズが制限されます(例:32ビットアドレス指定)。 しかし、最大スタックサイズがデフォルトまたはコンパイラオプションによって事前に制限されていないプログラミング言語やランタイム環境については知りません。これが、プロセスで利用可能なメモリの最小割合だけがスタックに使用されている場合でも、過度の再帰がユビキタススタックオーバーフローエラー/例外を非常に迅速に引き起こす理由です。 ほとんどの(すべてではないにしても)ランタイム環境が、実行時にスタックが成長できるサイズの最大制限を設定するのはなぜですか?
46 stack 

7
データベースの制約はどうなりましたか?
RDBMSのデータベースモデルを確認すると、通常、PK / FK以外の制約がほとんどまたはまったくないことに驚かされます。たとえば、パーセンテージは多くの場合型の列に格納されますがint(tinyintより適切です)CHECK、値を0..100の範囲に制限する制約はありません。同様にSE.SEでも、チェック制約を示唆する回答は、データベースが制約の間違った場所であることを示唆するコメントをしばしば受け取ります。 制約を実装しないという決定について尋ねると、チームメンバーは次のように応答します。 そのような機能がお気に入りのデータベースに存在することすら知らないということです。ORMのみを使用するプログラマからは理解できますが、特定のRDBMSで5年以上の経験があると主張するDBAからはほとんど理解できません。 または、アプリケーションレベルでそのような制約を強制し、データベースでそれらのルールを複製することは、SSOTに違反して、良いアイデアではありません。 最近では、外部キーさえ使用されないプロジェクトが増えています。同様に、ユーザーが参照整合性をあまり気にせず、アプリケーションにそれを処理させることを示す、SE.SEに関するいくつかのコメントを見ました。 FKを使用しない選択についてチームに尋ねると、次のように伝えます。 たとえば、他のテーブルで参照されている要素を削除する必要がある場合は、PITAです。 NoSQLは揺れ動き、外部キーはありません。したがって、RDBMSではそれらは必要ありません。 パフォーマンスの点では大したことではありません(コンテキストは通常​​、小さなデータセットで動作する小さなイントラネットWebアプリケーションですので、実際にはインデックスでも大したことはありません。特定のクエリのパフォーマンスが1.5 。〜20ミリ秒) アプリケーション自体を見ると、次の2つのパターンに体系的に気付きます。 アプリケーションは、データベースに送信する前にデータを適切にサニタイズしてチェックします。たとえば102、アプリケーションを介して値をパーセンテージとして保存する方法はありません。 アプリケーションは、データベースからのすべてのデータが完全に有効であると想定しています。つまり102、パーセンテージで表示された場合、どこかでクラッシュするか、単にユーザーにそのまま表示され、奇妙な状況になります。 クエリの99%以上が1つのアプリケーションによって実行されますが、時間が経つにつれて、スクリプトが表示され始めます。必要に応じてスクリプトを手動で実行するか、cronジョブを実行します。一部のデータ操作も、データベース自体で手動で実行されます。スクリプトと手動SQLクエリの両方に、無効な値が導入されるリスクが高くなります。 そしてここに私の質問が来ます: チェック制約なしで、最終的には外部キーなしでもリレーショナルデータベースをモデル化する理由は何ですか? 価値のあることについては、この質問と私が受け取った回答(特にThomas Kilianとの興味深い議論)により、データベースの制約についての結論を書いた記事を書くことになりました。


6
`c> = '0'`または` c> = 48`をチェックする方が良いですか?
同僚と話し合った後、ベストプラクティスに従って、Javaでcharデータ型をどのように扱うかについて「哲学的な」質問をしました。 入力としてString 's'が与えられた場合、その中に存在する数字の数を数える必要がある単純なシナリオ(明らかに、これは私の質問に練習の意味を与えるための非常に単純な例です)を想定してください。 これらは2つの可能な解決策です: 1) for(int i=0; i<s.length(); i++) { if(s.charAt(i) >= 48 && s.charAt(i) <= 57) { n++; } } 2) for(int i=0; i<s.length(); i++) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9' ) { n++; } } どちらがより「クリーン」でJavaのベストプラクティスに準拠していますか?

7
セッターのチェインが型破りなのはなぜですか?
Beanにチェーンを実装すると非常に便利です。コンストラクター、メガコンストラクター、ファクトリーをオーバーロードする必要がなく、読みやすさが向上します。オブジェクトを不変にしたい場合を除き、欠点は考えられません。その場合、とにかくセッターはありません。これがOOPの慣例ではない理由はありますか? public class DTO { private String foo; private String bar; public String getFoo() { return foo; } public String getBar() { return bar; } public DTO setFoo(String foo) { this.foo = foo; return this; } public DTO setBar(String bar) { this.bar = bar; return this; } } //...// DTO …

4
NoSQLに画期的なものはありますか?[閉まっている]
私は非常に堅実なリレーショナルデータベースの男であり、第3正規形までのすべてを理解し、SQLの代数集合論の根を高く評価し、おそらく失恋を関係付ける(またはしない)ことができます。 私は妻とデートするためのリレーショナルデータベース構造を理解していませんが、妻とデートするためのリレーショナルデータベースプロジェクトについて考えました。 今、私はNoSQLについて聞いて、それを調査しています。簡単に言えば、画期的で数学的に斬新なNoSQLについて何かありますか、または「データをリレーショナルに整理する必要さえないので、これは非常に簡単です」タイプのアプローチですか? NoSQLはデータ構造のスーパーシェルのようなものですか?私の考えでは、データには最終的に取得する構造が必要であり、検索は何らかの言語で定義する必要があります。
46 nosql 

6
Javaコレクションを意味のあるクラス名でマスクする良い習慣か悪い習慣ですか?
最近、私は人間に優しいクラス名でJavaコレクションを「マスキング」する習慣を身につけています。いくつかの簡単な例: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } または: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what it is and what // it …

7
リファクタリングの潜在的な価値を測定する方法
技術的な負債を抱える古い大規模なプロジェクトでは、リファクタリングコードの利点をどのように確実に推定または測定できますか? たとえば、古い言語で記述されたソフトウェアスタックソリューション内のコンポーネントと、新しい言語で記述された後のコンポーネントがあるとします。このソリューションには、開発チームによって常に新しい機能とバグ修正が追加されています。 開発者は、既存の古い言語コンポーネントを新しいバージョンに置き換えることは「良いこと」だと提案します。ただし、この作業によって追加の機能は追加されず、x開発日数かかります。 営業担当者は、「すばらしい新機能」を追加することを提案しています。会社は数式を使用して提案の価値を測定します。すなわち。x dev-daysの作業コストで、t年間でFポンドを獲得します。 どうすれば会社はリファクタリングの提案に意味のあるコストをかけることができますか?そして、どのような状況下でそれが会社にとって最も収益性の高いオプションになる可能性がありますか?

2
REST APIは、部分的に変更可能なリソースへのPUTリクエストをどのように処理する必要がありますか?
HTTP GETリクエストに応答して、REST API がサブオブジェクトで追加データを返すと仮定しますowner。 { id: 'xyz', ... some other data ... owner: { name: 'Jo Bloggs', role: 'Programmer' } } 明らかに、誰もがPUTバックアップできるようにしたくない { id: 'xyz', ... some other data ... owner: { name: 'Jo Bloggs', role: 'CEO' } } そしてそれを成功させます。確かに、この場合、おそらく潜在的に成功する方法さえ実装しないでしょう。 しかし、この質問はサブオブジェクトだけではありません。一般的に、PUTリクエストで変更できないデータを使用して何を行う必要がありますか? PUTリクエストから欠落している必要がありますか? 静かに捨てるべきですか? チェックする必要があり、その属性の古い値と異なる場合、応答でHTTPエラーコードを返しますか? または、JSON全体を送信するのではなく、RFC 6902 JSONパッチを使用する必要がありますか?

3
C#/ OOPでは貧弱なドメインモデルが悪いと考えられますが、F#/ FPでは非常に重要なのはなぜですか?
でブログの記事楽しさと利益のためにF#上、それは言います: 機能設計では、動作をデータから分離することが非常に重要です。データ型は単純で「ダム」です。そして、別に、これらのデータ型に作用する多くの関数があります。 これは、動作とデータを組み合わせることを意図したオブジェクト指向設計の正反対です。結局のところ、それはまさにクラスです。実際にオブジェクト指向の設計では、振る舞い以外は何もありません。データはプライベートであり、メソッドを介してのみアクセスできます。 実際、OODでは、データ型の周囲に十分な動作がないことは悪いことと見なされ、「貧血領域モデル」という名前さえあります。 C#では、F#から借用し続け、より機能的なスタイルのコードを記述しようとしているようです。なぜデータ/動作を分離するという考えを借りず、それを悪いと考えるのでしょうか?定義がOOPを伴わないというだけなのでしょうか、それともC#で悪いのに何らかの理由でF#に適用されない(そして実際には逆になる)具体的な理由がありますか? (注:私は、ブログ投稿のどちらかの意見に同意しない個人ではなく、善/悪の意見を変える可能性のあるC#/ F#の違いに特に興味があります)。

4
抽象化が多すぎると悪いことはありますか?
プログラマーとして、私たちの目標は、与えられたドメインモデルとビジネスロジックを適切に抽象化することだと思います。しかし、この抽象化はどこで止めるべきですか?抽象化とそのすべての利点(柔軟性、変更の容易さなど)と、コードとそのすべての利点の理解の容易さとの間でトレードオフを行う方法。 私は過度に抽象化されたコードを書く傾向があり、それがどれほど良いのかわかりません。私はよく、2つの部分で構成されるマイクロフレームワークのようなものを書く傾向があります。 マイクロフレームワークに接続されたマイクロモジュール:これらのモジュールは、単一ユニットとして理解、開発、および保守が容易です。このコードは基本的に、要件で説明されている機能的な機能を実際に実行するコードを表しています。 接続コード; 今ここに私は問題があると信じています。このコードは、時には非常に抽象化されていて、最初は理解しにくいため、複雑になる傾向があります。これは、純粋な抽象化、現実のベース、および提示されたコードで実行されるビジネスロジックにすぎないという事実により発生します1。この理由から、このコードはテスト後に変更されることはありません。 これはプログラミングの良いアプローチですか?多くのモジュールで非常に断片化されたコードの変更が非常に理解しやすく、抽象化POVからの変更のないコードは非常に複雑であるということですか?すべてのコードが均一に複雑である(つまり、コード1がより複雑で相互にリンクされ、コード2がより単純である)ため、コードを見ている人は合理的な時間内にそれを理解できますが、変更は高価であるか、上記のソリューションは優れています「コードの変更」は理解、デバッグ、変更が非常に簡単であり、「コードのリンク」は一種の困難です。 注:これはコードの可読性に関するものではありません!1と2のコードはどちらも読み取り可能ですが、2のコードにはより複雑な抽象化があり、コード1には単純な抽象化があります。

5
古いプログラミング言語が引き続き改訂されるのはなぜですか?
この質問は、「なぜ人々はまだ古いプログラミング言語を使用しているのですか?」ではありません。私はそれをよく理解しています。実際、私が最もよく知っている2つのプログラミング言語はCとSchemeで、どちらも70年代に遡ります。 最近、C99とC11対C89の変更について読んでいました(実際にCの最も使用されているバージョンであり、K&Rから学んだバージョンです)。周りを見ると、頻繁に使用されるすべてのプログラミング言語は、少なくとも10年に1回程度新しい仕様を取得しているようです。Fortranを使用しているほとんどの人がまだFORTRAN 77を使用しているという事実にもかかわらず、Fortranでも新しいリビジョンを取得しています。 たとえば、組版システムTeXのアプローチと比較してください。1989年、TeX 3.0のリリースに伴い、Donald KnuthはTeXは機能が完全であり、将来のリリースにはバグ修正のみが含まれると宣言しました。これ以上に、彼は彼の死の際に、「残っているすべてのバグが機能になる」と述べており、それ以上の更新は一切行われないと述べています。他の人はTeXを自由にフォークして自由にフォークできますが、結果のシステムの名前が変更され、公式のTeXとは異なることを示します。これは、KnuthがTeXを完璧だと考えているからではなく、50年後に同じことをする安定した予測可能なシステムの価値を理解しているからです。 ほとんどのプログラミング言語デザイナーが同じ原則に従っていないのはなぜですか?もちろん、言語が比較的新しい場合、落ち着く前に急速な変化の期間を経ることは理にかなっています。また、既存の疑似標準を体系化するか、意図しない読み取り値を修正する以上の小さな変更に、実際に誰も反対することはできません。しかし、10、20年経ってもまだ言語の改善が必要なように思える場合、すでに使用されているものを変更しようとするのではなく、単にフォークするか、最初からやり直さないのですか?Fortranでオブジェクト指向プログラミングを本当にしたい人がいるなら、その目的のために「Objective Fortran」を作成し、Fortranをそのままにしてみませんか? 将来の改訂に関係なく、C89はすでに標準であり、人々がそれを使用し続けることを止めるものはないと言えるでしょう。これは一種の真実ですが、意味合いには結果があります。GCCは、pedanticモードで、C99で非推奨またはわずかに異なる意味を持つ構文について警告します。つまり、C89プログラマーは新しい標準を完全に無視することはできません。したがって、C99には、言語を使用するすべての人にこのオーバーヘッドを課すのに十分な利点がなければなりません。 これは本当の質問であり、議論を呼びかけるものではありません。明らかに私はこれについて意見を持っていますが、現時点では、これがすでに行われている方法だけではない理由を理解しようとしています。質問は次のとおりです。 古い言語に基づいて新しい言語を作成するのではなく、言語標準を更新することの(実際の、または認識されている)利点は何ですか?

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