ソフトウェア工学

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

5
静的なメソッドだけを含む*** Helperまたは*** Utilクラスの使用はAntiPatternです
私はしばしば、Javaのヘルパークラスまたはutilクラスまたはあらゆる種類の言語に直面しています。それで、私はこれがアンチパターンの一種であり、この種のクラスの存在はソフトウェアの設計とアーキテクチャに欠けているだけかどうかを自問していた。 多くの場合、これらのクラスは、多くのことを行う静的メソッドのみを使用して制限されます。しかし、ほとんどの場合、実際にはコンテキストに依存し、ステートフルです。 私の質問は、そのような種類の静的ヘルパー/ユーティリティクラスについてのあなたの意見は何ですか?利点はもちろんクラス名だけを使用した高速呼び出しであるためです。 そして、これらの種類のクラスの使用を避けるのは、どのような抽象化レベルですか? 私の意見では、キーワード「static」はクラスの宣言(Java)内でのみ許可され、メソッドでは許可されません。私の意見では、この方法でそれを使用することは、Javaで手続き型パラダイムとオブジェクト指向パラダイムを組み合わせて、キーワードの誤用を回避するための優れた代替手段であると考えられます。 答えによる追加: 最初は、異なるパラダイムを組み合わせたり、マシンまたはvmでコンパイルされたコード内で実行時解釈スクリプト言語を使用したりすることは完全に合法だと思います。 私の経験では、プロジェクトの開発プロセス中に、そのような種類のヘルパーやユーティリティ、または名前が何であれ、コードベースの忘れられた隅々で成長し、使用されています。そして、リファクタリングを行う時間や設計をもう一度考える時間がないため、時間の経過とともにそれをさらに悪化させます。 staticJavaから削除する必要があると思います。特に今では、さらに洗練された関数型言語要素を使用することができます。

8
TryGetValueよりもC#辞書を使用するより良い方法はありますか?
私はよくオンラインで質問を探しますが、多くのソリューションには辞書が含まれています。しかし、それらを実装しようとするたびに、コードにこの恐ろしい悪臭が入ります。たとえば、値を使用するたびに: int x; if (dict.TryGetValue("key", out x)) { DoSomethingWith(x); } これは、基本的に次のことを行う4行のコードです。 DoSomethingWith(dict["key"]) outキーワードを使用すると、関数のパラメーターが変化するため、アンチパターンであると聞きました。 また、キーと値を反転させる「逆」辞書が必要になることがよくあります。 同様に、辞書の項目を繰り返し処理して、キーまたは値をリストなどに変換して、これを改善したいと思うことがよくあります。 辞書を使用するより良い、よりエレガントな方法はほとんど常にあるように感じますが、私は途方に暮れています。

4
コルーチンが戻ってきたのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 コルーチンの基礎の大部分は60年代/​​ 70年代に発生し、その後、代替手段(スレッドなど)を支持して停止しました。 Pythonや他の言語で発生しているコルーチンへの新たな関心に対する実質はありますか?

1
Java 8コードの条件付きカバレッジを測定するのは理にかなっていますか?
Java 8が登場して以来、現在のJava用ツールによる条件付きコードカバレッジの測定は時代遅れではないのかと思っています。Javaの8のではOptionalとStream私たちはしばしば、それが簡単にすべての可能な実行パスをテストすることなく、非常に高い条件カバレッジを取得することができますコード分岐/ループを回避することができます。古いJavaコードとJava 8コードを比較してみましょう。 Java 8より前: public String getName(User user) { if (user != null) { if (user.getName() != null) { return user.getName(); } } return "unknown"; } 上記のメソッドには3つの実行パスがあります。条件付きカバレッジを100%取得するには、3つの単体テストを作成する必要があります。 Java 8: public String getName(User user) { return Optional.ofNullable(user) .map(User::getName) .orElse("unknown"); } この場合、ブランチは非表示になり、100%のカバレッジを得るために必要なテストは1つだけで、テストするケースは関係ありません。カバーすべき3つの論理ブランチはまだありますが、信じています。最近の条件付きカバレッジ統計は完全に信頼できないものになっていると思います。 Java 8コードの条件付きカバレッジを測定するのは理にかなっていますか?十分にテストされていないコードを発見する他のツールはありますか?

4
Pythonブロックのコロンは技術的に必要ですか?
これは実際には、Pythonの初心者がもっと理解したいという理論上の質問です。 Pythonのブロック初期ステートメントの後、コロンを忘れ続けます。それらは私が意味するものです: for <variable> in <sequence>: if <blah blah>: 私の考えでは、忘れがちな理由の1つは、それらが事実上の暗黙的であるということです。コロンであるかどうかにかかわらず、ステートメントはその行で終わります。 私の質問-私はPythonの構文がどのように機能するかを学ぶために尋ねます-コロンが本当に不要かどうかです?コロンが不要になるようにPython構文を変更しましたが、何かが壊れるでしょうか?それはいくつかのステートメントを曖昧にするか不可能にするでしょうか?
19 python  syntax  theory 

4
どのUMLダイアグラムがまだ広く使用されていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 私は学部レベルでソフトウェア工学を教えており、UML実践者に質問があります。 ほとんどのソフトウェアエンジニアリングの教科書は、UMLダイアグラムのカバーに真剣に取り組んでいます。しかし一方で、多くの卒業生から、UMLはもはやトレンチで使用されていないようだと聞きました。 どのUMLダイアグラムが現在でも専門的な実践で広く使用されていますが、その理由は何ですか?使用されなくなった図はありますか?その理由は? NB:意見に基づく議論や議論を避けるために、事実と客観的な要素(可能であれば、検証可能)または個人的な経験に関する中立的な観察で答えを説明してください

8
C#-フィールドのプレフィックスが推奨されないのはなぜですか?
昔、私たちはハンガリー語表記をしていました。これは今ではpasséと見なされており、ほとんどの場合はもう使用していませんが、m_メンバーフィールドを示すためにプレフィックスを使用することはまだあります。 私にとって、他の誰かのコードを読んでいると、私はこれを見る: count = 3; 私はそれcountがその関数のローカル変数であると仮定し、関数の他の場所で使用される何かをしています。私がこれを見たら: m_count = 3; オブジェクトの状態を更新していることにすぐに気付きます。 マイクロソフトのスタイルガイドラインでは、それが物事を行う間違った方法であると述べています。関数内で定義された一時変数とまったく同じ非公開フィールドに名前を付けることになっています。いいえm_、単純なアンダースコアですらありません。 はい、独自のコーディングスタイルを定義することはできますが、その後、さまざまな静的コード分析ツールに取り組み、物事のやり方が問題ないことを説得する必要があります。 マイクロソフトのスタイルに変更できてうれしいですが、なぜそうなっているのかを知りたいです。 変数が関数ローカルであるかメンバーであるかを判断できるのはなぜ悪いと考えられるのですか? PSこれは、C#のフィールドとメソッドの前にある「this」キーワードに関して現在考えられているベストプラクティスと非常に似ていますか?、しかし私は聞いてm_いないthis. PPSまた、Microsoftがパラメーター、ローカル変数、およびプライベートフィールドに同じ名前の命名規則を付けた理由を参照してください。

7
特定の値を文字列として保存するのは悪い習慣ですか?
それは非常に曖昧なタイトルですが、私はそれを表現するより良い方法を考えることができませんでした。しかし、ちょうど一例として、ゲーム内のキャラクターが動いている方向について考えてください。文字列を使用してからのようなことをするのはちょっと間違っているように感じif(character.direction == "left")ます。の代わりにを誤って使用しLeftたりl、他の何かを使用したりするなど、愚かなエラーの余地が多すぎるように思えleftます。私の疑いは正しいですか?もしそうなら、このような何かを達成するための好ましい方法は何ですか?

10
開発の開始時または終了時に、パフォーマンスを向上させるためにソフトウェアを最適化するのはいつですか?
私はジュニアソフトウェア開発者であり、パフォーマンス(速度)を向上させるためにソフトウェアを最適化するのに最適な時期はいつになるのか疑問に思っていました。 ソフトウェアが非常に大きく、管理が複雑ではないと仮定すると、最初にそれを最適化するためにより多くの時間を費やす方が良いでしょうか、またはすべての機能を正しく実行するソフトウェアを開発し、パフォーマンスを向上させるために最適化を進めるべきですか?

8
枝が積もらないようにする
機能がテスト用にステージングされるようになると、規模が大きくなるにつれて問題に遭遇し始めますが、すべてがテストされ、承認された新しい機能がテスト用にステージングされます。 これは、テスト済みの機能と未テストの機能の組み合わせがあるため、本番環境にほとんどプッシュできない環境を作成しています。これは一般的な問題であると確信していますが、まだ私たちにとって良いリソースが見つかりませんでした。 いくつかの詳細: BitBucketのGIT Azureへのスクリプト展開用のJenkins 私が望んでいるのは、機能が環境を移動するときに機能を分離し、準備ができているものだけをプッシュする方法です。


5
「深い構成階層」も悪くないですか?
「構成階層」が問題でない場合はおApびしますが、質問でそれが何を意味するのかを説明します。 「継承階層をフラットに保つ」や「継承よりも合成を優先する」などのバリエーションに遭遇していないオブジェクト指向プログラマーはいません。ただし、深い構成階層にも問題があるようです。 実験の結果を詳述するレポートのコレクションが必要だとしましょう: class Model { // ... interface Array<Result> m_results; } 各結果には特定のプロパティがあります。これらには、実験の時間と、実験の各段階からのメタデータが含まれます。 enum Stage { Pre = 1, Post }; class Result { // ... interface Epoch m_epoch; Map<Stage, ExperimentModules> m_modules; } いいですね 現在、各実験モジュールには、実験の結果を説明する文字列と、実験サンプルセットへの参照のコレクションがあります。 class ExperimentalModules { // ... interface String m_reportText; Array<Sample> m_entities; } そして、各サンプルには...まあ、あなたは絵を取得します。 問題は、アプリケーションドメインのオブジェクトをモデリングしている場合、これは非常に自然なフィットのように思えますが、結局のところ、a Resultは単なるデータの無意味なコンテナです!それのためにクラスの大きなグループを作成することは価値がないようです。 上記のデータ構造とクラスがアプリケーションドメインの関係を正しくモデル化すると仮定すると、深い構成階層に頼ることなく、そのような「結果」をモデル化するより良い方法はありますか?そのようなデザインが良いデザインかどうかを判断するのに役立つ外部コンテキストはありますか?

5
設計上のプログラミング言語は「クリーンコード」を強制できますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉じた3年前。 ですから、私は最初のプロジェクトをC ++でコーディングしていますが、単に機能するのではなく、コードを「クリーン」にするのにより多くの努力が必要と思われます。つまり、C ++が、いが動作するコードを「許可」しているように見えます。 考えさせられた プログラミング言語は、設計によってクリーンなコードを実施できますか?そのような言語はすでにありますか? また、これはプログラミング言語の開発/理論の設計原則としてどのように組み込まれていますか?どのような手段が使用されていますか?

4
イベント駆動型プログラミング:いつ価値があるのか​​?
わかりました、この質問のタイトルは、イベントベースのプログラミングをいつ使用する必要があるかとほぼ同じです。しかし、上記の質問の答えは、私が直面している特定のケースでイベントを使用すべきかどうかを決定するのに役立ちませんでした。 私は小さなアプリケーションを開発しています。それはシンプルなアプリであり、その機能の大部分は基本的なCRUDです。 特定のイベント(特定のデータを変更する場合)で、アプリケーションはそのデータのローカルコピーをファイルに書き込む必要があります。これを実装する最善の方法についてはわかりません。できます: データが変更されたときにイベントを起動し、そのようなイベントに応答をバインド(ファイルを生成)します。または、オブザーバーパターンを実装します。それは不必要な複雑さのようです。 データを変更するコードからファイル生成コードを直接呼び出します。はるかに単純ですが、依存関係をこのように設定するのは間違っているようです。つまり、アプリのコア機能(データを変更するコード)をその追加の特典(バックアップファイルを生成するコード)に結合するのは間違っているようです。ただし、このアプリは、そのカップリングが問題を引き起こすポイントまで進化しないことを知っています。 この場合の最善のアプローチは何ですか?

7
マネージャーは、開発と本番の複合環境を望んでいます
私は大規模な組織をサポートする小さなプログラミングチームで働いています。今年、マネージャーは、Oracle Apexテクノロジーを使用して会社データの大部分を処理することを決定しました。 Apexサーバーが1つしかないことを除いて、これは問題ありません。マネージャーは、すべてがその1つのインスタンスで発生することを決定しました。私たちのチームはアプリを開発していますが、マネージャーはそれらをデモし、社内のクライアントはそれらを使用します。 Apexへの投資が増え、アプリがより複雑になり、ユーザーの数が増えるにつれて、これが悪化すると予想されます。ベストプラクティスは、開発環境、テスト環境、および運用環境を別々にすることだと聞きましたが、なぜそうなのですか? 質問:開発環境、テスト環境、および運用環境を個別に用意する必要があるのはなぜですか?

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