ソフトウェア工学

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


5
複数のデータベースアクセスまたは1つの大規模なアクセス?
それは、パフォーマンスと最適なリソース使用率に来るときよりよいアプローチは何である:それだけが必要なときに必要な正確な情報を入手するために複数回のAJAXを介してデータベースにアクセスする、またはすべての情報保持するオブジェクト取得するために、一回のアクセスを実行する可能性が必要となることを、すべてが実際に必要なわけではないという高い確率で? 実際のクエリをベンチマークする方法は知っていますが、何千人ものユーザーがデータベースに同時にアクセスしているときのデータベースパフォーマンスに関して、接続プーリングがどのように作用するかをテストする方法はわかりません。
25 performance  sql 

1
C ++。Netは広く使用されていますか?
私は伝統的にC ++コーダーです。過去12か月ほどで、私は多くのC#コーディングを行っており、C#の実用的なアプローチに驚きました(「ガベージコレクションを使用したC ++」であるかのようにコーディングしようとするのをやめました)。 最近、卒業生が何人かいますが、そのうちの1人を助けると、C ++で.Netを使用していることに気付きました。理由を尋ねた後、彼女は「マネージャーからC ++を使用するように言われた」と言いました。明らかなコミュニケーションの問題は別として、彼女が.Netを使用していたのは、それが彼女にさらされた唯一のフレームワークだからです。 その後、C ++を使用してFormsフロントエンドを駆動する上級開発者による古いプロジェクトに出会いました。これは.Netが最初に登場した頃に書かれていたので、.Netをいじるのは彼の側の学習課題だったと思います。それは小さなユーティリティアプリでした。 このアプリでいくつかの小さな変更を行う必要があったため、C ++を使用して.Netを駆動すると、両方の世界で最悪の事態が発生するように思えました。ガベージコレクションやメモリの安全性はありませんが、マネージドフレームワークを扱っているため、同様に実際の速度/最適化の機会はありません。 だから私の質問は、人々がC ++ .Netを大規模なスタンドアロン(つまり非配管)プロダクションコードに使用するかどうかであり、そうであればあなたの理由は何ですか?私はC ++ .Net拡張機能を深く掘り下げたことがないので、私はそれを害しているのではないかと自由に認めています。
25 c++  .net 

8
初心者に最適なC ++ソースコードは何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 私はC ++ソースコードを読むことでC ++コーディング技術を改善しようとしています。どのオープンソースプロジェクトをお勧めしますか?Boost C ++ Librariesのコードは良いものですか?
25 c++  open-source 

6
基本的に構造のないプロジェクトを修正する方法は?
私は、5年以上にわたってほとんどソロでソフトウェアプロジェクトに取り組んできました。始めは混乱でした(私が取り組んでいる3番目または4番目の開発者です)が、混乱は少なくなりましたが、まだ非常に混乱しています。それを制御できるようになるまでの進行速度は氷河期であり、私はそれが現在の状態に落胆し始めていると感じています。 プロジェクトの詳細:これは、ほぼ完全にVisual Basic Classic(VB6)で記述された販売プログラムで、MySQLバックエンドとレポートエンジンがC#で記述されています。C#レポートモジュールは、作業するのが楽しいです。過去数年で書かれたばかりで、Crystal Reports 9ですべてのレポートが作成されました(はい、まだ依存しているレポートがいくつかあります)。 ただし、実際のプログラム自体は完全な災害です。LOCの合計は90,000ほどではなく、コメントの行数は10,000になります(ほとんどはドキュメントではなく、コメントアウトされた古いコードです)。158個のフォームファイルと80個のモジュールファイル。プログラムの一部の機能は単純に非推奨になり、(場合によっては)関連するコードをプログラムから削除せずにそのように表記されるため、それらのどれだけが実際に使用されているのかわかりません。実際に生産的に使用されているのはコードの50%だけだと思います。 あいまいなクライアントが依存している何かを壊しているかどうかわからないという理由だけで、多くのコードに触れることを恐れています。コード全体に地雷が散らばっているようなものです。 プロジェクトには実際には構造がありません。私がこれまで改革する忍耐を持っていたいくつかの場所を除いて、それはオブジェクト指向ではありません。フォーム上のデータを取得する必要がある場合は、データベースオブジェクトをインスタンス化し、関数内でクエリを宣言し、それを実行して、データセットで必要な処理を行います。 プロジェクトの作業を開始したとき、使用中のソース管理はありませんでした。私が取り組んでいる他の人々にそれを使用するように奨励しようとしましたが、私は新しい人であり、人々にSubversionを使用させるための私の試みは失敗しました。同社の主任開発者はここ数年でようやく水銀のバグを発見し、すべての開発者が現在すべてのプロジェクトでソース管理を使用していることを確認しました。 プロジェクトの改革にフルタイムで取り組むことができた場合、まともな進歩を遂げることができ、おそらくプロジェクトを完全に改造するのにどれくらいかかるかを見積もることさえできると思いますが、それは積極的に使用されています火を消す、バグを修正する、機能を追加するなどのように常に求められます。 では、どうすればこのプロジェクトを実際に修正し始めることができますか?別の言語でVB6を使用してみませんか?空き時間にプログラムを書き直してみてください。またはこれは完全に絶望的ですか? 更新 この投稿の後、私は熱心にプロジェクトに戻りましたが、そのようなゆっくりした進歩を見た後、数ヶ月以内に絶望に陥りました。それから、このサイクルを来年かそこらでさらに2、3回繰り返しました。 それから別の仕事に移りました。vb6の長年の経験と、他のテクノロジーの周辺経験だけでしたが、検索は難しく、途中で多くの拒否に直面しました(1年間で約12件のインタビュー)。この状況にある他の人への私のアドバイスは、この要素だけを残すことを検討することです。このような行き止まりの位置にとどまることによってあなたのキャリアに与えるダメージを考えてください。

6
依存性注入; 定型コードを減らす良い習慣
簡単な質問があり、答えがあるかどうかはわかりませんが、試してみましょう。私はC ++でコーディングしており、グローバル状態を回避するために依存性注入を使用しています。これは非常にうまく機能し、予期しない/未定義の動作を頻繁に実行しません。 しかし、私のプロジェクトが成長するにつれて、定型的なものと考える多くのコードを書いていることに気づきました。さらに悪いことに、実際のコードよりも定型的なコードが多いため、理解が難しい場合があります。 良い例に勝るものはありません。 Timeオブジェクトを作成するTimeFactoryというクラスがあります。 詳細(関連があるかどうかはわかりません):Timeオブジェクトは非常に複雑です。Timeにはさまざまな形式があり、それらの間の変換は線形でも簡単でもないためです。各「Time」には、変換を処理するSynchronizerが含まれており、適切に初期化された同じシンクロナイザーを使用するために、TimeFactoryを使用します。TimeFactoryにはインスタンスが1つしかなく、アプリケーション全体であるため、シングルトンの資格がありますが、可変なので、シングルトンにしたくありません 私のアプリでは、多くのクラスがTimeオブジェクトを作成する必要があります。これらのクラスは深くネストされている場合があります。 クラスBのインスタンスを含むクラスAからクラスDまでのクラスAがあるとします。クラスDはTimeオブジェクトを作成する必要があります。 私の単純な実装では、TimeFactoryをクラスAのコンストラクターに渡します。クラスAは、クラスBのコンストラクターにそれを渡し、クラスDまで続きます。 ここで、TimeFactoryのようなクラスと上記のようなクラス階層がいくつかあると想像してください。依存性注入を使用すると考えられる柔軟性と読みやすさをすべて失います。 私は私のアプリに大きな設計上の欠陥がないのではないかと考え始めています...または、これは依存性注入を使用するのに必要な悪ですか? どう思いますか ?

1
ボックスモデル:Internet ExplorerとW3C
現在、Internet Explorerボックスモデルの問題はほとんど問題ではありません。ほとんどのWeb開発者は、<!DOCTYPE>標準への準拠を強制するためのタグを配置しますが、Internet Explorer 5.5のサポートを本当に気にする人はいません。 しかし、一部の開発者は、IEボックスモデルを防御するための主観的で概念的な議論を思いつきました。IEモデルはボックス自体を測定するのに対し、W3Cモデルはボックスのコンテンツを測定するため、IEボックスモデルはW3Cモデルよりも「直感的」であると主張しています。 私は彼らの視点を見ることができますが、それは基本的に主観的な議論であり、最も重要なことは標準への準拠です。 ただし、最近、深刻な実用上の理由からIEボックスモデルを好むようになりました。W3Cボックスモデルでは、要素を別の要素の正確な画面上のピクセル幅に動的にサイズ変更することは困難です。その理由はstyle.width、要素のプロパティが要素の画面上の合計サイズを考慮していないためです。追加の境界線とパディングも考慮する必要があります。両方の要素が同じCSSクラスを使用している場合、これは問題ではありませんが、異なる CSSクラスがある場合、これは非常に困難になる可能性があります。 AとBの2つのdivがあるとします。AはHTMLで400px divとしてハードコードされていますが、BはJavascriptを使用して動的に作成されます。視覚的には、BをAの正確な幅にする必要があります。古いIEボックスモデルでは、これは簡単です。私たちは単に言う:B.style.width = A.style.width、またはB.style.width = A.offsetWidth + "px"。 しかし、W3Cボックスモデルでは、これはそれほど単純ではありません。また、スタイルシートについても心配する必要があります。BがAと同じCSSクラスを持っている場合、単に言うことができますB.style.width = A.style.width。しかし、そうでない場合、そして美的理由でそれを望まないかもしれない場合、私たちは困っています。ここで、AとBの両方の境界線とパディングの合計ピクセルを考慮する必要があります。境界線とパディングが一貫性のない単位で指定されている場合、これは特に困難です(境界線は1px行であることが多いため、 emsで指定される場合があります)。次に、共通の単位(emからpxまたはpxからem)に変換する準不可能なタスクに直面しています。これはすべて、2つのdivを画面上に正確に並べるためです。 したがって、基本的に、W3Cボックスモデルでは、要素のサイズを設定するときにCSSの境界線とパディングの問題を考慮する必要がありますが、IEボックスモデルでは、幅がボックス全体のサイズを測定するため(エンドツー-end)、ボックスの内容ではなく。これにより、相互に関連して要素を動的にサイズ設定することが非常に簡単になります。 これはすべて、W3CモデルよりもIEボックスモデルを優先する非常に強力な理由のようです(少なくとも概念的には-もちろん、実際にはIEボックスモデルは死んでいます)。 質問:W3Cはなぜこのボックスモデルを選択したのですか?W3Cボックスモデルには、私には見られないいくつかの利点がありますか?または、ここで問題を単に誇張していますか?

2
LGPL v3の「配布」を構成するもの
LGPL Webアプリケーションに基づいて新しいソフトウェアを作成することを検討しています。この新しいソフトウェアを使用して、雇用主向けに1つのWebサイトを作成したいのですが、ソフトウェア自体を誰にも販売または配布するつもりはありません。LGPLソフトウェアからWebページを公開することはライセンスの「配布」を構成するので、LGPLコードへの変更も公開する必要がありますか? 私はあなたの誰も弁護士ではないことを理解しているので、IANALは暗示されています。また、LGPLソフトウェアの開発者に連絡して、別のライセンスを要求できることも理解しています。

3
マルチスレッドアプリケーションのUML図
シングルスレッドアプリケーションの場合、クラス図を使用して、そのアプリケーションのアーキテクチャの概要を取得します。ただし、このタイプのダイアグラムは、たとえば、異なるスレッドでクラスの異なるインスタンスが「ライブ」であるため、重いマルチスレッド/同時実行アプリケーションを理解しようとするときにはあまり役に立ちません(つまり、インスタンスへのアクセスは、それが住んでいるスレッド)。したがって、クラス間の関連付けは、必ずしもそれらのオブジェクトのメソッドを呼び出すことができるという意味ではありませんが、代わりにターゲットオブジェクトのスレッドで呼び出しを行う必要があります。 Hassan GomaaによるUMLを使用した並行、分散、およびリアルタイムアプリケーションの設計などのトピックについて掘り下げたほとんどの文献には 、スレッド境界をオブジェクト図に描画するなどの素晴らしいアイデアがありましたが、本当に便利です。 これらの図を問題ドメインの高レベルのビューとして使用するのではなく、クラス/オブジェクト、それらの相互作用、および前述のスレッド境界による制限の詳細な説明として使用します。 したがって、私は知りたい: マルチスレッドアプリケーションの理解に最も役立つとわかったのは、どのような種類の図ですか? マルチスレッドアプリケーションの特性を考慮したクラシックUMLの拡張機能はありますか。たとえば、 一部のオブジェクトは特定のスレッドに存在し、他のオブジェクトはスレッドアフィニティを持たない場合があります。 オブジェクトの一部のフィールドは、任意のスレッドから読み取ることができますが、1つのスレッドからのみ書き込むことができます。 いくつかのメソッドは同期して結果を返しますが、他のメソッドはリクエストをキューに入れて、たとえば異なるスレッドのコールバックを介して結果を返す非同期です。

5
アルゴリズムがO(log n)であるかどうかの判別
CS理論を更新し、アルゴリズムO(log n)の複雑さを識別する方法を知りたいです。具体的には、それを識別する簡単な方法はありますか? 私はO(n)を知っています、あなたは通常単一のループを持っています。O(n ^ 2)は二重ループです。O(n ^ 3)はトリプルループなどです。O(log n)はどうですか。

5
アジャイルの一部としてドキュメントを設計する
私の職場では、「アジャイル」とは「あいまいな要件、受け入れ条件の悪さ、幸運」を意味することが多いという課題に直面しています。私たちは、一般的な改善努力として、それに対処しようとしています。 そのため、その一環として、ユーザーストーリーレベルを超えて、システム内の特定の機能の影響の予備調査の結果を正確に反映し、私たちが持っている質問への回答を含む設計ドキュメントを生成することを提案していますビジネスに尋ねた。 これに効果的な基準はありますか? 現在、新しい機能が「泥の大玉」システムの複数の領域に影響を与える可能性がある状況に直面しており、この技術的負債により見積もりが上昇し始めています。うまくいけば、より思慮深い設計プロセスが役立つことがあります。

4
既に存在するオブジェクトに機能を追加するにはどうすればよいですか?
特定の量の明確に定義された機能を備えたインターフェイスがあります。まあ言ってみれば: interface BakeryInterface { public function createCookies(); public function createIceCream(); } これはインターフェイスのほとんどの実装でうまく機能しますが、いくつかのインスタンスでは、いくつかの新しい機能を追加する必要があります(新しいメソッドにロールインするなどcreateBrownies())。これを行うための明白/単純なアプローチは、インターフェースを拡張することです。 interface BrownieBakeryInterface extends BakeryInterface { public function createBrownies(); } しかし、既存のAPIを変更せずに新しい機能を追加できないという点でかなり大きな欠点があります(新しいインターフェイスを使用するようにクラスを変更するなど)。 インスタンス化後に機能を追加するためにアダプターを使用することを考えていました。 class BrownieAdapter { private brownieBakery; public function construct(BakeryInterface bakery) { this->brownieBakery = bakery; } public function createBrownies() { /* ... */ } } これは私に次のようになります: bakery = new …

5
OOPの概念を適用して、シンプルだが実際のWebアプリを構築するにはどうすればよいですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 私は頭をOOPに巻き付けるために長い間努力してきました。その利点がわかります。私は多くのチュートリアルを読み、このテーマについて同量のビデオを見ました。動物/猫/犬の例、車/ドライブの例があります。私が苦労しているのは、これらの概念を実際のアプリケーションに適用する方法です。そこで、OOPを使用してビルドすることにしました。 私は構文の助けを求めたり、特定のコードを書いたりするのではなく、ドキュメントやフォーラムなどを検索することで、自分自身を見つけることができます。私を指導してくれるベテランのプログラマーはいますか? 私の学習プロジェクトとして、シンプルなクラシファイド「ウェブアプリ」を構築したいと思います。Craigslistに似たものですが、範囲の点でかなり落ち着きました。PHP5とMySQLは使い慣れているので、使用したいと思います。 これらの2つのユースケースのみがあるとしましょう: 売り物を投稿する 購入するものを閲覧/検索する オブジェクトとなる「もの」は何ですか?各アイテムがオブジェクトになる可能性があると想像できますが、どの時点でですか?なぜ? たとえば、ユーザーが「販売アイテムを投稿する」フォームに入力すると、そのフォームはオブジェクトに変換され、値をデータベースに挿入する別のオブジェクトに渡されますか? 別のユーザーがカテゴリCのすべてのアイテムを閲覧してリクエストする場合はどうでしょうか?アプリがデータベースに接続する必要があるときはいつでも、データベースオブジェクトを作成し、アイテムオブジェクトの束を取得してページに表示するのは理にかなっていますか?…これを書くことで、OOPについてまだ無知であることを実感できます。それを修正するのを手伝ってください。 あなたの意見で、これがOOPに足を踏み入れるのに適したプロジェクトではない場合、別のアイデアを提案してください。

3
予測される変更を計画しているRESTエンドポイントの推奨パターンは何ですか
変更のための先見の明を持つ外部アプリケーション用のAPIを設計しようとすることは簡単ではありませんが、少し前もって考えておくことで、後で生活が楽になります。私は、以前のバージョンのハンドラーをそのままにしておくことで、後方互換性を維持しながら将来の変更をサポートするスキームを確立しようとしています。 この記事の主な関心事は、特定の製品/会社に対して定義されたすべてのエンドポイントでどのパターンに従う必要があるかです。 基本スキーム のベースURLテンプレートを考えると、https://rest.product.com/すべてのサービスが/api、/authおよびなどの他の非レストベースのエンドポイントと共に存在することを考案しました/doc。したがって、次のようにベースエンドポイントを確立できます。 https://rest.product.com/api/... https://rest.product.com/auth/login https://rest.product.com/auth/logout https://rest.product.com/doc/... サービスエンドポイント 次に、エンドポイント自体について説明します。懸念はPOST、GET、DELETEこの記事の主な目的ではなく、それらのアクション自体に懸念されます。 エンドポイントは、名前空間とアクションに分類できます。また、各アクションは、戻り値の型または必須パラメーターの基本的な変更をサポートする方法で表示される必要があります。 登録されたユーザーがメッセージを送信できる架空のチャットサービスを利用すると、次のエンドポイントがある場合があります。 https://rest.product.com/api/messages/list/{user} https://rest.product.com/api/messages/send 今度は、壊れる可能性のある将来のAPI変更に対するバージョンサポートを追加します。私たちは、どちらかの後にバージョンの署名を追加することができ/api/たりした後/messages/。与えられたsendエンドポイント我々は、v1の以下のものを持つことができます。 https://rest.product.com/api/v1/messages/send https://rest.product.com/api/messages/v1/send だから私の最初の質問は、バージョン識別子の推奨場所は何ですか? コントローラーコードの管理 そのため、以前のバージョンをサポートする必要があることを確立しました。そのため、時間の経過とともに廃止される可能性のある新しいバージョンのそれぞれのコードを何らかの方法で処理する必要があります。Javaでエンドポイントを記述していると仮定すると、これをパッケージで管理できます。 package com.product.messages.v1; public interface MessageController { void send(); Message[] list(); } これには、すべてのコードがネームスペースを介して分離されているという利点があります。この場合、重大な変更はサービスエンドポイントの新しいコピーを意味します。これの不利な点は、すべてのコードをコピーする必要があり、新しいバージョンと以前のバージョンに適用するバグ修正を各コピーに適用/テストする必要があることです。 別のアプローチは、エンドポイントごとにハンドラーを作成することです。 package com.product.messages; public class MessageServiceImpl { public void send(String version) { getMessageSender(version).send(); } // Assume we have …

7
関数型言語では異なるコメントが必要ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 関数型プログラミングを始めたばかりで、コードをコメントする正しい方法について疑問に思っています。 名前と署名はすでにあなたが知る必要があるすべてをあなたに伝えるはずなので、短い関数をコメントすることは少し冗長に思えます。大きな関数は一般的に小さな自己記述関数で構成されているため、大きな関数のコメントも少し冗長に見えます。 機能的なプログラムにコメントする正しい方法は何ですか?反復プログラミングと同じアプローチを使用する必要がありますか?

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