ソフトウェア工学

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

7
後で使用するためにループにフラグを設定するのはコードの匂いですか?
特定の条件が満たされるまでマップを反復処理し、後でその条件を使用してその他の処理を実行するコードがあります。 例: Map<BigInteger, List<String>> map = handler.getMap(); if(map != null && !map.isEmpty()) { for (Map.Entry<BigInteger, List<String>> entry : map.entrySet()) { fillUpList(); if(list.size() > limit) { limitFlag = true; break; } } } else { logger.info("\n>>>>> \n\t 6.1 NO entries to iterate over (for given FC and target) \n"); } if(!limitFlag) …


6
依存関係はいつ更新する必要がありますか?
2つの異なるコードベース(AndroidとNode.js Webアプリ)を使用した2つの主要な依存関係関連の危機がありました。AndroidリポジトリはFlurryからFirebaseに移行する必要がありました。これには、Google Play Servicesライブラリの4つのメジャーバージョンの更新が必要でした。同様のことが、HerokuがホストするNodeアプリでも発生しました。このアプリでは、実稼働スタック(cedar)が廃止され、cedar-14にアップグレードする必要がありました。PostgreSQLデータベースも9.2から9.6に更新する必要がありました。 これらのアプリの各依存関係はほぼ2年間古く、一部が廃止されて「日没」期間に達したとき、それらを更新または置換することは大きな頭痛の種でした。過去1〜2か月で30時間以上かけて、すべての競合と壊れたコードをゆっくりと解決してきました。 明らかに物事を2年間放置するのは長すぎます。特に、Herokuのようなプラットフォームプロバイダーを使用している場合、テクノロジーは急速に動きます。本格的なテストスイートと、Travis CIのようなCIプロセスがあり、更新から多くの当て推量を取り除くと仮定しましょう。たとえば、アップグレード後に関数が削除され、それを使用している場合、テストは失敗します。 依存関係を更新する頻度、または依存関係を更新するタイミング 強制されたため更新しましたが、何らかの先制的なアプローチの方が良いようです。マイナーバージョンがリリースされたら更新する必要がありますか?メジャーバージョン?更新が利用可能な場合、毎月ですか?どうしても犠牲になったような状況を避けたい。 PS-私の個人的なRailsプロジェクトの1 つでは、Gemnasiumと呼ばれるサービスを使用します。これは、セキュリティの脆弱性などを通知できるように、依存関係を追跡します。これは素晴らしいサービスですが、私が言及したプロジェクトの依存関係を手動で確認する必要があります。

2
Cプリプロセッサの起源は何ですか?
CプリプロセッサはCに接続されていますが、メイン言語とはまったく異なる構文を持っています。 構文的に重要な空白(行の終わりはステートメントを終了し、マクロが置換リストの開始を決定した後のギャップ) キーワードベースの代わりにブレースブロックのブロック、elif代わりにelse if 宣言-反映-使用の代わりにキーワード主導の定義=、値の定義は不可 代替文字列構文のヒント(#include <>vs #include "") 怠evaluationな評価(Cのことは明らかですが、6.10.3.1は、重要ないくつかの場所で、マクロ展開の特定の順序を暗示していると読むこともできます) まったくCのようには見えません!技術的には独自の言語ですが、常にCのほぼ統合された部分として使用されており、構文的に統合されないことは非常に奇妙に思えます。 ウィキペディアはその歴史について語っていません。Portland Pattern Repository にはパスの言及がありますが、Cの歴史を持つ他の人々によって設計されたという事実を超えて詳細に説明することはありません。より長く利用可能。 マクロエンジンとして、それは明らかに説明するだろうランタイム言語から非常に異なる意味があるいくつかの違いがではなく、視覚的なデザインの側面を(それがもともとあるものとして意図されていたかどうかも現代の目には不明だが可能なの種類の楽しみのこと置換システムでは、強力なオプティマイザーが登場する前に関数をインライン化するための「単なる」適切な方法であったか、またはそうであったかを確認できます。Cのようなセマンティクスが実際に出発点だった場合、最終的にC ++テンプレートになったものに近いものがマクロに向かってより論理的な進化を遂げたように感じますが、構文に関するよりも具体的な証拠はありません。 なぜこのように設計されたのか、クリエイターの影響がどのようなものだったのかについての記録はありますか?
30 c  history  macros 

6
数千のエラー!
私は最近新しいプロジェクトに割り当てられました。まあ、実際には古いプロジェクトは、古典的なASPで書かれています。現在、アプリケーションの新しいバージョンは最新のASP.NETで記述されていますが、しばらくはRTMになるとは予想されていません(推定リリース日は2017年1月です)。破棄されました。 また、すべての顧客がすぐに新しいプログラムに切り替えるわけではないという感覚もあるので、このバージョンはおそらくしばらくは使用されるでしょう。 そして問題は、それがエラーだらけだということです。その一部は、Web標準がなかった前世紀にまでさかのぼり、Quirksモードやwidth、heightCSSの代わりの属性、レイアウトに使用されるテーブル、フレームセットなどについてはあまり気にしませんが、これらすべてのエラーです!width="20px"すべての場所onchange="javascript:..."、、style="width:20"およびそれらが実際にcssを使用する場所でありstyle="width=20px"、一般的です。矛盾widthやstyle属性が存在する多くの行は言うまでもありません。など。 その結果、WebアプリケーションはIEでのみ、互換モードでのみ実行されます。開発者がコードの妥当性を検討したことはないことは明らかです。出てきたものが自分の考えていたもののように見えた場合にのみ、そのように見えるはずです。 そして、私はそれを処理する方法がわかりません。コードで他のエラーを確認しながら、これらのエラーに目をつぶることは不可能だと思います。 もちろん、大部分の問題を回避するためにグローバルな検索と置換を行うことができますが、それは最初のコミットが何千もの変更された.aspファイルで構成されることを意味します。それをしてもいいですか?

8
テスト駆動開発(および一般的なアジャイル)のこの制限は実際に関連していますか?
テスト駆動開発(TDD)では、最適ではないソリューションから開始し、テストケースを追加してリファクタリングすることにより、より良いソリューションを繰り返し生成します。ステップは小さいと想定されています。つまり、新しいソリューションはそれぞれ前のソリューションの近くにあることになります。 これは、勾配降下法やローカル検索などの数学的なローカル最適化方法に似ています。このような方法のよく知られた制限は、グローバルな最適値、または許容可能なローカルな最適値を見つけることを保証しないことです。開始点が悪い解の大きな領域によってすべての許容可能な解から分離されている場合、そこに到達することは不可能であり、メソッドは失敗します。 より具体的に言うと、いくつかのテストケースを実装した後、次のテストケースではまったく異なるアプローチが必要になるというシナリオを考えています。前の作業を破棄して、最初からやり直す必要があります。 この考え方は、TDDだけでなく、小さなステップで進行するすべてのアジャイルメソッドに実際に適用できます。この提案されたTDDとローカル最適化の類推には重大な欠陥がありますか?

4
Scalaのような関数型言語でORMが必要ないのはなぜですか?
Spring + HibernateプロジェクトでJavaからScalaに切り替えて、パターンマッチング、OptionなどのScalaの機能を活用し、一般的にはより簡潔な構文に見えるかどうか疑問に思っています。私はScalaエコシステムでデフォルトでORMを探していましたが、Activateのような考え方を見つけました(しかし、ほとんどはHibernateをScalaで使用できるかどうかを見つけようとしています)。これを検索して、JPA + Scalaに関するPlayのドキュメントでこれを読みました。 しかし、最も重要なポイントは、関数型言語の力を持っているときに、オブジェクトとリレーショナルのマッパーが本当に必要なのかということです。 おそらくない。JPAは、データ変換におけるJavaのパワー不足を抽象化する便利な方法ですが、ScalaからJavaを使用し始めると、本当に間違っていると感じます。 私は関数型プログラミングを使用して完全なアプリケーションを作成する方法を深く理解していません(だからこそ、オブジェクト指向と関数型を組み合わせているため、これを段階的に理解できるようにScalaを使用するつもりです)。関数型言語のORMが必要ない理由と、ドメインモデルの永続性に取り組むための関数型アプローチはどうなるのか。 Scalaでは、ビジネスロジックに対するDDDアプローチが依然として理にかなっていますよね?

9
クラスを設計して、個々のプロパティではなくクラス全体をパラメータとして取得する
たとえば、広く共有されているクラスと呼ばれるアプリケーションがあるとしUserます。このクラスは、ユーザー、ID、名前、各モジュールへのアクセスレベル、タイムゾーンなどに関するすべての情報を公開します。 ユーザーデータは明らかにシステム全体で広く参照されていますが、何らかの理由で、このユーザーオブジェクトをそれに依存するクラスに渡すのではなく、個々のプロパティを単に渡すようにシステムが設定されています。 ユーザーIDを必要とするクラスは、userIdパラメーターとしてGUID を必要としますが、ユーザー名も必要な場合があります。そのため、別のパラメーターとして渡されます。場合によっては、これは個々のメソッドに渡されるため、値はクラスレベルでまったく保持されません。 Userクラスから別の情報にアクセスする必要があるたびに、パラメーターを追加して変更する必要があり、新しいオーバーロードの追加が適切でない場合は、メソッドまたはクラスコンストラクターへのすべての参照も変更する必要があります。 ユーザーはほんの一例です。これは、コードで広く実践されています。 これはオープン/クローズの原則に違反していると思うのは正しいですか?既存のクラスを変更するだけでなく、そもそもクラスを設定して、将来的に広範囲の変更が必要になる可能性が非常に高くなりますか? Userオブジェクトを渡したばかりの場合は、作業しているクラスに少し変更を加えることができます。パラメータを追加する必要がある場合は、クラスへの参照に数十の変更を加える必要があります。 この慣行によって他の原則が破られていますか?おそらく依存関係の逆転?抽象化を参照しているわけではありませんが、ユーザーは1種類しかないため、ユーザーインターフェイスを持つ必要はありません。 基本的な防衛プログラミングの原則など、違反している他の非ソリッドの原則はありますか? 私のコンストラクタは次のようになります: MyConstructor(GUID userid, String username) またはこれ: MyConstructor(User theUser) 投稿編集: 「パスIDまたはオブジェクト?」で質問に回答することが提案されています。これは、どちらの方向に進むかの決定が、この質問の中心にあるSOLID原則に従う試みにどのように影響するかという質問には答えません。
30 java  c#  design  solid 

6
明確な意味を持つ2つの方法、または1つのデュアルユース方法を使用する方が良いでしょうか?
インターフェイスを簡素化するには、getBalance()メソッドを持たない方が良いでしょうか?に渡す0とcharge(float c);同じ結果が得られます。 public class Client { private float bal; float getBalance() { return bal; } float charge(float c) { bal -= c; return bal; } } たぶんメモしてくださいjavadoc?または、バランスを取る方法を理解するためにクラスユーザーに任せてください。
30 interfaces  cqrs 

5
数値が大きすぎる場合、次のメモリ位置にあふれますか?
私はCプログラミングをレビューしてきましたが、気になっていることがいくつかあります。 例としてこのコードを見てみましょう: int myArray[5] = {1, 2, 2147483648, 4, 5}; int* ptr = myArray; int i; for(i=0; i<5; i++, ptr++) printf("\n Element %d holds %d at address %p", i, myArray[i], ptr); intは正の2,147,483,647の最大値を保持できることを知っています。それで、それを越えて、次のメモリアドレスに「あふれ」、そのアドレスで要素2が「-2147483648」として表示されるのでしょうか。しかし、出力では次のアドレスが値4、5を保持していることを示しているため、それは実際には意味がありません。数値が次のアドレスにあふれた場合、そのアドレスに格納されている値は変更されません? MIPS Assemblyでのプログラミングと、プログラム中にアドレスが値を変更するのを見て、それらのアドレスに割り当てられた値が変わることを漠然と覚えています。 間違って覚えていない限り、別の質問があります:特定のアドレスに割り当てられた番号がタイプ(myArray [2]のように)よりも大きい場合、後続のアドレスに格納されている値には影響しませんか? 例:int myNum = 40億がアドレス0x10010000にあります。もちろん、myNumは40億を保存できないため、そのアドレスでは負の数として表示されます。この大きな数を格納することはできませんが、後続のアドレス0x10010004に格納されている値には影響しません。正しい? メモリアドレスには、特定のサイズの数字/文字を保持するのに十分なスペースがあり、サイズが制限を超えた場合、異なるように表示されます(intに40億を格納しようとしているが、負の数として表示されます)そのため、次のアドレスに保存されている数字/文字には影響しません。 船外に行ったら申し訳ありません。私はこれから一日中大きな脳のおならをしていました。

9
Pythonのような動的に型付けされた言語でのみ可能なデザインパターンはありますか?
関連する質問を読みました。Pythonのような動的言語には不要なデザインパターンはありますか?Wikiquote.orgでこの引用を思い出した 動的型付けのすばらしいところは、計算可能なものをすべて表現できることです。また、型システムはそうではありません—型システムは通常決定可能であり、サブセットに制限されます。静的型システムを好む人は、「それでいい、それで十分だ。作成したいすべての興味深いプログラムが型として機能します。」しかし、それはばかげています。型システムができたら、どんな面白いプログラムがあるのか​​さえわかりません。 ---ソフトウェアエンジニアリングラジオエピソード140:Gilad BrachaによるNewspeakおよびPluggable Types 引用の定式化を使用して、「型として機能しない」有用な設計パターンまたは戦略があるのだろうか?

3
XMLタイプが安全なのはなぜですか?
なぜ彼らはXMLが型の安全性を提供すると言っているのか、そしてそれはXML自体でどのように表現されているのか? (たとえば)JSONとはどう違いますか(私が理解しているように)、タイプセーフではありませんか?
30 xml  type-safety 

4
.equals()がJavaのクラスにあるのに、なぜ.compareTo()がインターフェイスにあるのですか?
クラス内にあるようなメソッド.compareTo()がComparableインターフェイスにある理由を知りたいです。私には、なぜそのようなメソッドがクラスにないのかはarbitrary意的に思えます。.equalsObject.compareTo()Object を使用する.compareTo()には、目的に応じてComparableインターフェイスを実装し、.compareTo()メソッドを実装します。以下のために.equals()、すべてのクラスから継承するため、この方法は、単に、あなたのクラスのメソッドをオーバーライドしObjectたクラス。 私の質問は、なぜ.compareTo()クラスのようなものではなく、実装するインターフェースのようなメソッドなのObjectですか?同様に、実装されるインターフェースではなく.equals()、クラスのメソッドがなぜObjectですか?

5
製品設計の決定の背後にある理論的根拠を記録する効果的な方法は何ですか?
当社では、製品設計文書を使用していません。合計3人の従業員がいるため、製品設計に関するすべての議論は直接、またはSlackで行われます。(最新のメッセージの表示のみを許可する基本的なSlackパッケージも使用しています。) 当社の製品はまだ初期段階にあり、数か月前に決定された設計要素を頻繁に再検討しています。 私たちが悲惨なほど頻繁に直面する問題は、製品設計の決定が下された理由を忘れることです。これにより、同じ地面をリトレッドするのに何時間も無駄になります。 設計決定の背後にある理論的根拠をどのように効果的に記録できますか? ワークフローはPivotal Trackerに基づいています。私に起こる解決策の1つは、関連するすべての設計決定の理論的根拠をユーザーストーリー自体へのコメントとして記録することですが、これは信頼できないようです。 100%明確にするために:私はコードの設計について話しているのではありません。私は、コードによって実現される製品の設計について話している。言い換えれば、「多重継承ではなく構成を使用してこのクラスを構成すべきか?」などの決定について話しているのではありません。「ログインする前に、ユーザーにメールアドレスを確認してもらう必要がありますか?」などの決定について話している。 ドキュメントの目的は、ビジネスが意思決定が行われた理由の記録を表示できるようにし、同じトピックに関するさらなる意思決定を支援することです。


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