ソフトウェア工学

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

3
Micro ORMが導入された今、インラインSQLは依然として悪い習慣に分類されていますか?
これは少し自由な質問ですが、インラインSQLスクリプトが標準である世界で育ったので、私はいくつかの意見が欲しかったので、SQLインジェクションに基づく問題と、SQLがどれほど脆弱であるかをすべて非常に認識しましたあらゆる場所で文字列操作を行います。 次に、クエリをORMに説明し、独自のSQLを生成させるORMの夜明けが来ました。多くの場合、これは最適ではありませんが、安全で簡単です。ORMまたはデータベース抽象化レイヤーのもう1つの良い点は、SQLがデータベースエンジンを念頭に置いて生成されたため、Hibernate / NhibernateをMSSQL、MYSQLで使用でき、コードが変更されることはなく、構成の詳細だけであったことです。 マイクロORMがより多くの開発者を獲得しているように見える今日に早送りします。なぜインラインSQLの主題全体でU-Turnを採用したように見えるのか疑問に思いました。 ORM構成ファイルがなく、より最適な方法でクエリを作成できるというアイデアが好きであることを認めなければなりませんが、SQLインジェクションなどの古い脆弱性に立ち向かうように感じており、データベースエンジンが1つなので、ソフトウェアで複数のデータベースエンジンをサポートしたい場合は、文字列のハッカーをさらに実行する必要があり、コードが判読不能で壊れやすくなります。(誰かが言及する前に、ほとんどの場合、SQLインジェクションからの保護を提供するほとんどのマイクロオームでパラメータベースの引数を使用できることを知っています) それでは、この種のことについての人々の意見は何ですか?この例ではDapperをMicro ORMとして使用し、NHibernateをこのシナリオでは通常のORMとして使用していますが、各フィールドのほとんどは非常によく似ています。 私の用語インラインSQLソースコード内のSQL文字列です。以前は、ロジックの基本的な意図を損なうソースコードのSQL文字列をめぐる設計上の議論がありました。そのため、静的に型付けされたlinqスタイルクエリが非常に人気があり、まだ1つの言語でしたが、1つのページでC#とSql 2つの言語が生のソースコードに混ざりました。明確にするために、SQLインジェクションはsql文字列の使用に関する既知の問題の1つにすぎません。パラメーターベースのクエリでこれが発生するのを防ぐことができることは既に述べましたが、次のようなソースコードにSQLクエリを埋め込むことに関する他の問題を強調しますDBベンダーの抽象化の欠如、および文字列ベースのクエリでのコンパイル時エラーキャプチャのレベルの喪失、これらはすべて、より高いレベルのクエリ機能を備えたORMの夜明けを回避することができた問題です。 したがって、私は個々の強調された問題にはあまり焦点を当てておらず、より大局的には、ほとんどのマイクロORMがこのメカニズムを使用するため、ソースコードに直接SQL文字列を含めることがより受け入れられるようになりました。 micro ormコンテキストのないインラインSQLの詳細ですが、いくつかの異なる視点を持つ同様の質問があります。 https://stackoverflow.com/questions/5303746/is-inline-sql-hard-coding
26 database  sql  orm 

2
循環的複雑度の範囲[閉じた]
循環的複雑度のカテゴリーは何ですか?例えば: 1-5:維持しやすい 6-10:難しい 11-15:非常に難しい 20+:近づきにくい 何年もの間、私は10が制限であるという仮定を行ってきました。そしてそれ以上のものは悪いです。私は解決策を分析しており、コードの品質を判断しようとしています。確かに循環的な複雑さだけが測定値ではありませんが、それは役立ちます。循環的複雑度が200以上のメソッドがあります。私はそれがひどいことを知っていますが、上の例のように、より低い範囲について知りたいです。 私はこれを見つけました: カーネギーメロンの前述の参照値は、循環的複雑度値の4つの大まかな範囲を定義しています。 1から10までの方法はシンプルで理解しやすいと考えられます 10から20の間の値は、より複雑なコードを示しますが、依然として理解しやすいかもしれません。ただし、コードが取り得る分岐の数が多いため、テストはより難しくなります。 20以上の値は、非常に多数の潜在的な実行パスを持つ典型的なコードであり、非常に困難かつ労力をかけてのみ完全に把握およびテストできます。 50を超えるなど、さらに高くなるメソッドは確かに維持できません ソリューションのコードメトリックを実行すると、25未満の場合に結果が緑色で表示されます。これには同意しませんが、他の入力を取得することを望んでいました。 サイクロマティックの複雑性について一般に受け入れられている範囲リストはありますか?

4
コードコントラクトを使用する理由
私は最近、Microsoftのコードコントラクトのフレームワークに出会いました。 私は少しのドキュメントを読んで、「静的分析を実行できないことが多いため、なぜこれを実行したいのか」と絶えず尋ねてきました。 今、私はすでに次のような例外を守って、ある種の防御的なプログラミングスタイルを持っています。 if(var == null) { throw new NullArgumentException(); } また、NullObject Pattern alotを使用していますが、問題はほとんどありません。ユニットテストを追加すれば、セットアップは完了です。 アサートを使用したことも、見逃したこともありません。まったく逆です。意味のない主張がたくさんあるコードは本当に嫌いです。これは、私にとってはノイズであり、本当に見たいものから気を散らすものです。コード契約、少なくともマイクロソフトのやり方はほとんど同じです-さらに悪いことです。それらはコードに多くのノイズと複雑さを追加します。とにかく、99%で例外がスローされます。そのため、それがアサート/コントラクトのどちらなのか、実際の問題なのかは気にしません。まさに、プログラムの状態が実際に破損するケースはほとんどありません。 率直に言って、コードコントラクトを使用する利点は何ですか?何かありますか?すでにユニットテストとコードを防御的に使用している場合、契約を導入することはコストの価値がなく、メンテナーがそのメソッドを更新するときに呪いをかけるコードにノイズを入れていると感じます。無駄なアサートのため。私はまだその代価を払う正当な理由を見ていません。

1
GPLでプログラムをリリースした場合、引き続きリリースする必要がありますか?
このシナリオを考慮してください: GPLライセンスのライブラリQuuxToolsを使用するプログラムFooSuiteを開発しています GPLの下でプログラムFooSuite 1.0をリリースしました 後で、何らかの理由で、別の条件で誰かにプログラムのライセンスを取得する必要があることに気付きました。 したがって: 次のいずれかの方法で、QuuxToolsを介してGPLへの依存を削除します。 このライブラリを使用しないようにプログラムを書き直す QuuxToolsの別のライセンスを取得する(デュアルライセンスの場合。PyQtを参照) 非GPLライセンスの下でFooSuite 1.1をリリースしました。 ただし、FooSuite 1.1は依然としてFooSuite 1.0から派生したものです。見知らぬ人が私がしたことをすることは合法ではないことを理解していますが、私自身-FooSuiteの所有者として-この制限から解放されていますか?
26 licensing  gpl 

5
システム上のすべての空きスペースを割り当てることにより、別のプログラムからメモリを読み取ることは可能ですか?
理論的には、システム上のすべての未使用メモリを割り当て、他のアプリケーションが不要になったメモリを解放するにつれてますます多くのメモリを要求し続けるプログラムをビルドすると、最近リリースされたメモリを別のアプリケーションから読み取ることができるでしょうか? ?または、これは何らかの形で最新のオペレーティングシステムによって保護されていますか? これには実用的なアプリケーションはありません。ただ興味があります。実生活で「利用可能なすべてのメモリ」を割り当てることには、いくつかの問題があることを理解しています。 編集:明確にするために、私は特に「解放された」メモリについて尋ねています。現在別のアプリケーションによって割り当てられているメモリにはアクセスしていません。

9
宣言型プログラミングの夢[終了]
宣言型プログラミングの夢が実現しなかったのはなぜですか?邪魔になる具体的な障害は何ですか?簡単な例では、なぜ私は言うことができません sort(A) is defined by sort(A) in perm(A) && asc(sort(A)) 自動的にソートアルゴリズムを取得します。permは順列をasc意味し、昇順を意味します。

7
参照がPHPでめったに使用されないのはなぜですか?
私はC ++の知識があり、ポインターが一般的に使用されていることを知っていますが、PHPのオープンソースコードを調べ始め、メソッドで参照を使用するコードを見たことはありません。 代わりに、コードは、変数への参照をメソッドに渡す代わりに常に戻り値を使用します。その後、変数の値が変更され、そのまま返されます。 参照を使用するとメモリ使用量が少なくなるので、なぜPHPで使用されないのですか?
26 php  reference 

8
SOLID原則の一部またはすべてがコードをきれいにするのに相反するOOPのフレーバーはありますか?
私は最近、ビデオゲーム開発におけるOOPについて友人と議論しました。 友人の驚いたことに、多くの小さなクラスといくつかの抽象化レイヤーを含むゲームのアーキテクチャを説明していました。これは、すべてに単一の責任を与え、コンポーネント間の結合を緩めることに集中した結果だと主張しました。 彼の懸念は、多数のクラスがメンテナンスの悪夢につながることでした。私の見解では、それはまったく逆の効果をもたらすだろうということでした。何世紀にもわたって思われたものについてこれについて議論を続け、最終的には同意しないことに同意し、SOLID原則と適切なOOPが実際にうまく混合されない場合があったと考えています。 SOLID原則に関するWikipediaのエントリでさえ、それらは保守可能なコードの作成を支援するガイドラインであり、アジャイルおよび適応プログラミングの全体的な戦略の一部であると述べています。 だから、私の質問は: OOPで、SOLID原則の一部またはすべてがコードのクリーン化に役立たない場合はありますか? Liskov Substitution Principleが安全な継承の別のフレーバーと競合する可能性があることはすぐに想像できます。つまり、誰かが継承を通じて実装された別の有用なパターンを考案した場合、LSPがそれと直接競合する可能性が非常に高いです。 他にありますか?おそらく、特定のタイプのプロジェクトまたは特定のターゲットプラットフォームは、より少ないソリッドアプローチでより適切に機能しますか? 編集: 私は自分のコードを改善する方法を尋ねていないことを指定したいだけです;)私がこの質問でプロジェクトに言及した唯一の理由は、少しコンテキストを与えることでした。私の質問は、一般的に OOPと設計原則についてです。 あなたは私のプロジェクトについて興味している場合は、参照これを。 編集2: この質問には、次の3つの方法のいずれかで答えると思いました。 はい、SOLIDと部分的に競合するOOP設計原則が存在します はい、SOLIDと完全に競合するOOP設計原則が存在します いいえ、SOLIDはミツバチのひざであり、OOPは永遠に優れています。しかし、すべてと同様に、万能薬ではありません。責任を持って飲んでください。 オプション1と2は、長くて興味深い回答を生成する可能性があります。一方、オプション3は、短くて面白くないが、全体的に安心できる答えです。 オプション3に収束しているようです。

4
同じ問題/チケットに複数の欠陥を投稿することが推奨されないのはなぜですか?
これが次の概念的な質問をする場所であるかどうかはわかりません(Stackoverflowは間違いなくそうではありません)。 この質問は、ISTQB試験に似た多肢選択試験(単一回答)で見ました。 同じ問題/チケットでいくつかの欠陥を報告することが推奨されないのはなぜですか? a。レポートを簡潔かつ明確にするため。 b。開発者が修正できるバグは1つだけだからです。 c。テストグループのテスターは、発見したバグの量によって評価されるためです。 d。バグ管理システムは、複数のバグのこの機能をサポートしていません。 私の唯一の意見は、それaが正しい答えだということです。 b-fix-feedback-resolved-closedがそのケースを回避するはずなので、それはできません。 c-明らかに間違っています。 d -Redmine / Tracプラグインは複数のフィールドをサポートします。 解答用紙によると、答えはbです。 誰かが理由を説明できますか?回答に関する意見を含むコメントを歓迎します。

8
大規模なWebサイトがバックエンドとフロントエンドに異なる言語を使用するのはなぜですか?
小さなMVCアプリケーションからの私の理解は、HTML、JS、jQueryなどを扱うフロントエンドと、コントローラーとモデルで構成されるバックエンドがあるということです。 ただし、大企業の開発者と話をするとき、フロントエンド層とバックエンド層があるとよく言われます。そのため、C#を使用したフロントエンドとJavaを使用したバックエンドがあると聞くことがあります。なぜ企業は異なる言語のバックエンドとフロントエンドを必要とするのでしょうか?これにより、大規模なWebサイトのスケーラビリティが向上しますか? フロントエンドがC#で構築されていると人々が言うとき、これはフロントエンドのフレームワーク(.NETなど)とバックエンドの追加フレームワーク(Springなど)を使用していることを意味しますか?それとも完全に異なるものを意味しますか?

6
IT要件を提案するのは開発者の仕事ですか?
私は、終わりに近づいているWebアプリケーションに取り組んでいる唯一の開発者です。現在、2、3か月後にライブにすることを検討しています。 これは非IT企業向けのWebアプリケーションです。彼らは独自の社内ITチームを持っていますが、ライブサーバーのハードウェア要件はどうなるかを尋ねられました。RAM、32ビットまたは64ビット。 社内のITチームがこれを行うべきではありませんか、それともプロジェクトに取り組んでいるのは私だけなので、プロジェクトのパフォーマンスに影響を与える可能性のある特定のハードウェア要件を彼らに知らせるのは私の責任ですか? 私がこの質問をしているのは、これをやったことがないからです。私はいつもサーバーを与えられ、その上にアプリを展開するように頼まれました。サーバーの構成などを心配することはありませんでした。


7
復帰文字は廃止と見なされますか
構造化されたデータを解析するオープンソースライブラリを作成しましたが、要点がわからないため、意図的にキャリッジリターン検出を省略しました。追加の複雑さとオーバーヘッドが追加され、ほとんど/まったく利点がありません。 驚いたことに、ユーザーがパーサーが機能していなかったバグを提出しました。問題の原因は、データがLFまたはCRLFではなくCR行の終わりを使用していることにあります。 UNIXベースのプラットフォームに切り替えてから、OSXはLFスタイルの行末記号を使用していませんか? 行末を明示的にCRを使用するように変更できるNotepad ++のようなアプリケーションがあることは知っていますが、なぜだれがそうしたいのかわかりません。 (何らかの理由で)古いMac OSスタイルの行末を決定する統計的に重要でない割合のユーザーのサポートを除外しても安全ですか? 更新: 明確にするために、Windowsの行末記号(CRLFなど)のサポートには、CRトークンの認識は必要ありません。効率化のため、字句解析器は文字ごとに一致します。CR文字を静かに無視することにより、CRLFトークンはLFに単純化されます。そのため、CRLFトークン自体は時代錯誤とみなすことができますが、それはこの質問の目的ではありません。 CRスタイルの行末をシステム全体でサポートする最後のOSはMac OS 9でした。皮肉なことに、OSXでデフォルトとして使用している唯一のアプリケーションはMicrosoft Excelです。

11
メンテナンスに関しては、「その他」はブレースを介在させずに安全と見なされますか?
であるelse while「安全」メンテナンスが賢明と考え括弧を介在せずに? if-else以下のような中括弧なしでコードを書く... if (blah) foo(); else bar(); ...中括弧がないため、コードの意味を不注意に変更することが非常に簡単になるため、リスクが伴います。 ただし、以下も危険ですか? if (blah) { ... } else while (!bloop()) { bar(); } またはelse while、介入する中括弧なしで「安全」と見なされますか?

5
設計の選択肢が優れている理由を説明するにはどうすればよいですか?[閉まっている]
私がより良い開発者になったので、私の設計スキルの多くは、機械的分析よりも直感から来ていることがわかります。これは素晴らしい。これにより、コードを読んで、すばやく感じられるようになります。これにより、言語と抽象化の間でデザインをはるかに簡単に翻訳できます。そして、それは私がより速く物事を成し遂げることを可能にします。 欠点は、特定の設計が有利な理由をチームメイト(さらに悪いことに、経営陣)に説明するのが難しいことです。特に、ベストプラクティスの時代遅れのチームメイト。「この設計はテスト可能です!」または「継承よりも合成を優先する必要があります。」彼らの頭を真っ直ぐに行き、最後の10年のソフトウェアエンジニアリングの進歩に誰もが手がかりを与えようとする私のうさぎの穴に導かれます。 もちろん、練習すれば良くなりますが、その間に多くの無駄な時間や悪い設計が必要になります(後で修正するために無駄な時間がかかることになります)。利点が視聴者に完全に明らかではない場合、特定のデザインが優れている理由をよりよく説明するにはどうすればよいですか?

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