ソフトウェア工学

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

4
コードカバレッジを劇的に改善する方法は?
ユニットテストの下でレガシーアプリケーションを取得することを任されています。アプリケーションに関する最初の背景:これらの主要な問題を伴う600k LOC Java RCPコードベースです。 大規模なコードの複製 カプセル化なし、ほとんどのプライベートデータは外部からアクセスできます。ビジネスデータの一部はシングルトンにもなっているため、外部からだけでなくどこからでも変更できます。 抽象化なし(たとえば、ビジネスモデルなし、ビジネスデータはObject []およびdouble [] []に格納されます)。したがって、OOはありません。 優れた回帰テストスイートがあり、効率的なQAチームがバグのテストと発見を行っています。マイケル・フェザーズなどの古典的な本からテストする方法を知っていますが、それは遅すぎます。実用的なリグレッションテストシステムがあるので、ユニットテストを作成できるようにシステムを積極的にリファクタリングすることを恐れていません。 迅速にカバレッジを得るために、どのように問題を攻撃し始める必要がありますか?そうすれば、経営陣に進捗を示すことができます(実際には、JUnitテストのセーフティネットから収益を上げることができます)?AgitarOneなどの回帰テストスイートを生成するツールを使用したくないのは、これらのテストは何かが正しいかどうかをテストしないためです。

1
MVCのコントローラーとMVVMのViewModelの違いは何ですか?
MVCとMVVMの違いがはっきりとわかりません。ViewModelのCommandは、ControllerのActionメソッドに似ていると思います。また、コントローラーとViewModelの両方が、データバインディングを介してモデルの状態を変更した後、それ自体を更新するようにビューに通知します。2つのパターンの主な違いは何ですか?

4
JavaScriptのプロンプト、確認、およびアラートは「旧式」と見なされる[終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 最近、私はジム用のウェブベースの管理システムを開発しています。以前のアプリはVisual Basicで開発されました。新しいアプリの場合、すべてのフロントエンドスクリプトはjQueryを使用し、サーバーはPHPとMySQLを実行しています...ご存じのとおり、典型的なel-cheapo linuxベースのスタックです。 とにかく、最近JavaScriptのプロンプト、確認、警告メッセージダイアログがあまり使用されていないのはなぜかと思っていました。モーダルウィンドウ用のjQueryプラグインと、言語が既に提供しているものを模倣しようとするアラートメッセージが多数あり、すべてのブラウザーは適切にサポートする必要があります。 複雑なフォームや特別なニーズには、ハンドメイドまたはプラグインベースのソリューションを使用しても問題ありませんが、単一の値を要求するか、レコードの削除を確認するだけの場合、Webアプリケーションにこのようなオーバーヘッドを追加するのはなぜですか?さらに、プロンプト、確認、警告を使用すると、iOSとAndroidでメッセージダイアログがうまく調整されます。

3
内部のクローズドソースプロジェクトでオープンソースライブラリを安全に使用できますか?
私は、内部のクローズドソースWinFormsプロジェクトで、Affero GPLの下でライセンスされているiTextSharpを使用することを考えています。社外の誰も使用しません。 GPL(およびAffero GPL)も通常、ソースにバイナリを提供することを要求します。これは内部プロジェクトであるため、従業員にプロジェクトのソースコードを提供する必要がありますか?
21 licensing  gpl  agpl 

7
Fortranベースの大きな数値演算コードベースをどのように近代化できますか?
学界の友人からアドバイスを求められました(私はC#ビジネスアプリケーション開発者です)。 彼は、Fortranで医療画像分野で書いたレガシーコードベースを持っています。ベクトルを使用して膨大な数の計算を行います。彼はクラスター(30のコア)を使用し、現在は500のGPUを持つ単一のワークステーションに向かっています。 ただし、次にコードベースを使用する場合: 他の人々は次の10年サイクルにわたってそれを維持することができます ソフトウェアの調整を高速化 再コンパイルせずに異なるインフラストラクチャで実行できます 私からのいくつかの研究の後(これは非常に興味深い分野です)、いくつかのオプションがあります: Nvidiaの PythonとCUDAを使用します 関数型言語で書き直してください。たとえば、F#またはHaskell クラウドベースに移行し、HadoopやJava などを使用する Cを学ぶ これについてどのような経験をしましたか?私の友人は彼のコードベースを近代化するために何を見るべきですか? 更新:@Markと回答してくれたすべての人に感謝します。私の友人がこの質問をしているのは、レビューを行うのがプロジェクトのライフサイクルの中で最適な時期だからです。Fortranでリサーチアシスタントを高速化するには時間がかかります(私はC#、特にツールが好きで、古い言語に戻ることは想像できません!!) Fortranで純粋な数値を処理し続けることをお勧めしますが、それを新しいものでラップすることをお勧めします。おそらくPythonは、かなり簡単に習得できる汎用プログラミング言語として学界の拠点になっているようです。 Medical ImagingとCUDAのFortranラッパーを書いた人を参照してください。Fortran90ラッパーをNvidiasのCUFFTライブラリ(CUDA SDKから)に合法的に公開できますか?。
21 math  legacy  fortran 

2
ハンドラー、マネージャー、コントローラーの違い
クラスに「Handler」、「Manager」、または「Controller」という名前を付けるのに違いはありますか?IE: 、PurchaseManager、。PurchaseHandlerPurchaseController これらの十分な意味は同じ意味を伝えますか、それとも明確な違いがありますか? 言語に依存しない答えがない場合は、Javaを言語と考えてください。
21 java  naming 

9
いつプライベート/内部クラスを使用すべきですか?
明確にするために、私が尋ねているのは public class A{ private/*or public*/ B b; } 対 public class A{ private/*or public*/ class B{ .... } } どちらか一方を使用するいくつかの理由を明確に考えることができますが、私が本当に見たいのは、長所と短所が単なる学術的ではないことを示す説得力のある例です。

14
プログラミングに興味を失った[終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 8年前に閉鎖されました。 この質問はして移行され、それがソフトウェア工学スタック所に答えることができるので、スタックオーバーフローから。 8年前に移行され ました。 私は現在、2年目の学士号のコンピューターサイエンスの学生です。私の問題はかなり簡単ですが、まだこれまでのところ自己解決できませんでした。プログラミングにうんざりしているだけです。理由はわかりませんが、それはただのことです。 C ++で最初のコースを始めたとき、とても興奮していました。とても興奮して、2か月以内に2冊の重いc ++本を完成させ、クラスと自分の期待をはるかに上回りました。アルゴリズムを簡単に開発してコーディングできるようでした。私はC ++をよく調べましたが、 しかし、過去2学期の間、私はコーディングにあまり興味がなく、それに対する多大な関心や情熱を失いました。 プログラミングもCS学位も大好きですが、それでも設定はできません。何をすべきか教えてください。私は自分でC#とXNA Gameの開発を開始しましたが、それでも自分自身を押し進めているようです。誰かが私の中のコーダーを起こすための提案を与えることができますか?
21 motivation 


7
再帰をサポートしていない命令型プログラミング言語は何ですか?
私の知る限り、現代のすべての命令型プログラミング言語は、プロシージャがそれ自体を呼び出すことができるという意味で再帰をサポートしています。これは必ずしもそうではありませんでしたが、簡単なGoogle検索で難しい事実を見つけることはできません。だから私の質問は: 最初から再帰をサポートしていなかったのはどの言語で、そのサポートはいつ追加されましたか?

2
依存性注入と静的メソッド
文字列を受け取り、文字列を出力するメソッドを使用してクラスにアプローチする方法について、今日、別の開発者と興味深い議論をしました。 例の目的のために完全に構​​成されている次のようなものを想像してください public string GetStringPart(string input) { //Some input validation which is removed for clarity if(input.Length > 5) return input.Substring(0,1); if(input.Substring(0,1) == "B") return input.Substring(0,3); return string.empty; } 文字列入力に基づいたロジックを持つ関数は、DIを使用してプロジェクトに追加され、DIコンテナが配置されています。この新しいクラスをインターフェイスで追加し、必要な場所に挿入しますか、それとも静的クラスにしますか?それぞれの長所と短所は何ですか?どこで必要なときにアクセスするだけでなく、コンストラクター注入で使用するようにしたい(またはしたくない)のはなぜですか。

1
MVVMで状態を管理するための良い正式なパターンはありますか?
私はウェブの世界でReduxとReactについて学び始めましたが、それについて学べば学ぶほど、WPFのMVVMスタイルのアーキテクチャ(特にビューをバインドするためにCaliburnを使用して) ViewModelsへ)。 Reduxには、状態の管理方法を指示するいくつかの簡単な原則があり、UIの更新、イベント処理、状態の変更をより予測可能にします。原則は次のとおりです。 単一の真実のソース(すべての可変状態は単一の共有オブジェクトに格納されます)。 状態は読み取り専用です。コード全体でコンポーネントによって変更することはできません。これは通常、WPFで発生することです。 状態は、純粋な関数によってのみ変更できます。 WPFのMVVMアーキテクチャを使用すると、インタラクティブビューを非常に迅速に構築できますが、さまざまなビューモデルやイベントがすべて状態を変更する場合のデバッグの問題は悪夢です。たとえば、ビューを変更してデフォルトのタブを設定しようとしたイベントが発生しましたが、Webサービスからのデータの非同期読み込みが完了していないため、タブはまだ存在しないため、何も起こりません 相互に更新する相互に関連するviewModelsコンポーネント間の複雑な相互作用を理解するために、私は何時間も図を描きました。 Reduxは、この状態の予測不可能性の一部を解決することを目指していることを理解しています。状態の管理を改善するために、WPFにうまく適合する類似の何か、またはアーキテクチャパターンがありますか?Reduxの原則が.NETでどの程度うまく機能するかは、まだ試していませんのでわかりません。おそらく誰かがいくつかのアドバイスを与えることができるいくつかの経験を持っていますか?
21 wpf  mvvm  state  redux 

3
多数のパラメーターとビルダーパターンを持つコンストラクター
クラスに多くのパラメーター(たとえば4個以上)を持つコンストラクターがある場合は、おそらくコードの匂いであることがよく知られています。クラスがSRPを満たすかどうかを再検討する必要があります。 しかし、10個以上のパラメーターに依存するオブジェクトをビルドし、オブジェクトを作成し、最終的にBuilderパターンを使用してこれらすべてのパラメーターを設定するとどうなりますか?Person個人情報、仕事情報、友人情報、興味情報、教育情報などを含むタイプオブジェクトを作成するとします。これは既に良いことですが、どういうわけか同じ4つ以上のパラメーターを設定していますか?なぜこの2つのケースは同じと見なされないのですか?

2
パッケージとモジュールがJava 9で別個の概念である理由
Java 9には、パッケージに加えてモジュールがあります。通常、言語にはどちらか一方があります。そして、ほとんどのプログラマーは 2つの用語を同義語として認識しています。モジュールはパッケージの上に構築され、それらをプリミティブとして扱います。複合パターンは、プリミティブと複合物を均一に処理することを提案します。そうしないと、悪いことが起こります。たとえば、プロジェクトValhallaを見てください。そこでは、プリミティブ(値)および参照型の共通スーパータイプを後付けしようとしています。 モジュールとパッケージは意味的に分離した概念を表していますか?それを意味することの両方を持つことが賢明である任意の言語(関心事の分離)。または、Javaは後方互換性への賛辞として両方を持たなければなりませんか? 既存の概念を補強するのではなく、なぜ新しい概念を導入するのですか? JSR 376:プロジェクトJigsaw内に実装された「Javaプラットフォームモジュールシステム」。 SOTMSによると モジュールは、コードとデータの名前付きの自己記述型コレクションです。そのコードは、Javaクラスとインターフェースなどのタイプを含むパッケージのセットとして編成されています。そのデータには、リソースおよびその他の種類の静的情報が含まれます。 JLSは、パッケージとは何かを定義することを慎重に避けます。ウィキペディアから: Javaパッケージは、JavaクラスをModulaのモジュールに似た名前空間に編成するための手法で、Javaでのモジュール式プログラミングを提供します。 ウィキペディアを引用するのは悪い習慣であることは知っていますが、それは一般的な理解を反映しています。モジュラープログラミングのエントリから: パッケージという用語は、モジュールの代わりに使用されることがあります(Dart、Go、またはJavaなど)。他の実装では、これは明確な概念です。Pythonではパッケージはモジュールのコレクションですが、今後のJava 9では新しいモジュールの概念(強化されたアクセス制御を備えたパッケージのコレクション)の導入が計画されています。

3
デカップリングとは何ですか?また、どの開発分野に適用できますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 私は最近、デカップリングが質問のトピックであることに気付き、それが何であり、どこで適用できるかを知りたいです。 「どこに適用できる」とは、次のことを意味します。 CやJavaのようなコンパイルされた言語が関係する場合にのみ関係がありますか? ウェブ開発者としてそれを知って勉強すべきですか?

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