ソフトウェア工学

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

6
私の場合、MongoDBは正しい選択ですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 6年前休業。 3つの主要な部分で構成されるWebアプリで構成される、Railsで最初の実際のプロジェクトを構築します。 データベースを使用しない静的部分 各ユーザーの行は同じフィールドを持つため、データベースを必要とし、MySQLを使用できるユーザー登録部分 ユーザーがコレクション内のアイテムを作成、整理、編集し、他のユーザーと共有できる「アプリ」 いくつかのアイテムタイプがあり、それぞれに異なるオプションがあります。たとえば、次のオプションを持つ「ビデオ」アイテムがあるとします。 id ユーザーID collection_id 題名 プラットフォーム(埋め込まれている場合) URL(埋め込まれている場合) ファイル名(アプリでホストされている場合) ファイルサイズ(アプリでホストされているID) 「マップ」アイテム: id ユーザーID collection_id 題名 プラットフォーム(Googleマップ、Bingマップ...) ロケーション url 地図のサイズ ユーザーがMySQLをアイテムに使用している間、各アイテムが別のアイテムとは異なるオプションを必要とする可能性があるため、MongoDBの柔軟性が役立つ場合があります。 これまで私は常にPHPとMySQLを使用してきました(常に小規模なプロジェクトでは共有ホスティングを使用しています)。スケーラビリティは私にとってまったく新しい言葉です。 学ぶ時間はありますが、1か月くらいで具体的なことができるようになりたいです。 私はMongoDBとNoSQLとRDMSとMySQLについてたくさん読んだので、それを試した後、MongoDBがどのように機能するかが好きだと言っておく必要があります。 私の状況では何をしますか?どうして? スケーラビリティについて、MongoDBに問題がある可能性はありますか?はいの場合(DBサイズに関して)、これらの問題によりアプリが大幅に遅くなる可能性がありますか? 編集:アプリの仕組み 多くの人がこれを私がアプリをどのように機能させたいかを尋ねたので: ユーザーがサインアップ 彼はログインしています 彼は無限のアイテムを作成できる彼の最初のコレクションisideを作成します アイテムにはさまざまなタイプがあり、タイプごとに異なるデータをデータベースに保存する必要があり、アイテムのタイプを追加または変更できます ユーザーはその中に他のコレクションやアイテムを作成できます。 そのため、コレクションとその内部のアイテムのCRUDがあり、各コレクション/アイテムは特定のユーザーに参照されます MySQLの主な問題は、柔軟なスキーマがないことです。これを解決する方法があります(回避策?)? NoSQLについて考えるときの唯一の疑問は、結合に関するものです。たとえば、特定のコレクションがあり、コレクション内のID = user_idフィールドを持つユーザーに関連するデータを取得したい場合 編集:MySQLを使い続けるためのアイデア 「items」テーブルに、オプション設定を含むフィールドを作成します。各設定は|で区切られます。または別のシンボル。 次に、各アイテムのオプション設定の構造をどこかに保存します。たとえば、「ノート」アイテムタイプには、MySQLからデータを取得するときに、2つのオプション設定「color」と「strange_setting」が必要です。オプション設定のフィールドを配列の最初の項目が「色」用であることを認識する配列など。 どう思いますか?その解決策に問題がありますか?他にアイデアはありますか?

3
複雑なステートフルクラスとそのテストを簡略化するにはどうすればよいですか?
私はJavaで書かれた分散システムプロジェクトに参加しています。このプロジェクトには、非常に複雑な現実のビジネスオブジェクトに対応するクラスがいくつかあります。これらのオブジェクトには、ユーザー(または他のエージェント)がそのオブジェクトに適用できるアクションに対応する多くのメソッドがあります。その結果、これらのクラスは非常に複雑になりました。 システムの一般的なアーキテクチャアプローチにより、多くの動作がいくつかのクラスに集中し、多くの可能な相互作用シナリオが発生します。 例として、わかりやすくするために、ロボットと車が私のプロジェクトのクラスであったとしましょう。 したがって、Robotクラスには、次のパターンで多くのメソッドが含まれます。 睡眠(); isSleepAvaliable(); 起きている(); isAwakeAvaliable(); walk(方向); isWalkAvaliable(); シュート(方向); isShootAvaliable(); turnOnAlert(); isTurnOnAlertAvailable(); turnOffAlert(); isTurnOffAlertAvailable(); recharge(); isRechargeAvailable(); 電源を切る(); isPowerOffAvailable(); stepInCar(Car); isStepInCarAvailable(); stepOutCar(Car); isStepOutCarAvailable(); 自己破壊(); isSelfDestructAvailable(); die(); isDieAvailable(); 生きている(); isAwake(); isAlertOn(); getBatteryLevel(); getCurrentRidingCar(); getAmmo(); ... Carクラスでも同様です。 オンにする(); isTurnOnAvaliable(); 消す(); isTurnOffAvaliable(); walk(方向); isWalkAvaliable(); refuel(); isRefuelAvailable(); 自己破壊(); isSelfDestructAvailable(); クラッシュ(); isCrashAvailable(); isOperational(); isOn(); …

7
メソッドがfalseを返すかどうかの確認:結果を一時変数に割り当てるか、メソッド呼び出しを条件付きで直接配置しますか?
ifステートメントでtrueまたはfalseの値を返すメソッドを呼び出すのは良い習慣ですか? このようなもの: private void VerifyAccount() { if (!ValidateCredentials(txtUser.Text, txtPassword.Text)) { MessageBox.Show("Invalid user name or password"); } } private bool ValidateCredentials(string userName, string password) { string existingPassword = GetUserPassword(userName); if (existingPassword == null) return false; var hasher = new Hasher { SaltSize = 16 }; bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword); return …

7
他の誰かの過去の仕事をどのように文書化できますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 過去の従業員がビジネスクリティカルなシステムに対して行ったカスタマイズに関するドキュメントがほとんどないという悪い状況にあります。Crystal Reports、データベースエンティティ、およびERPソフトウェアの独自の構成/プログラミングファイルに多くの変更が加えられました。 現在のドキュメントは一般的に次のようなものを読みます: このプログラムは、請求の前に実行されます。既知のバグ:なし。 ソフトウェアXのインストール後にこのプログラムを実行します。 このレポートの次のフィールドを変更しました:(方法や理由の説明なし) 私たちのITショップは小規模であり、ERPソフトウェアの場合、ほとんどの作業は1人の担当者(現在は私)に集中して行われたため、他の誰も私たちが行ったことすべてを知りません。ITと経理部門は細かい部分(たまに非常に役立つもの)を知っていますが、それだけでは十分ではありません。 もう1つの問題は、私たちの経理部門が、十分に文書化されていると考えているように見えることです。何が問題だったかについて多くの記録を残していたのは事実ですが、これらの問題を修正するために何が行われたか(もしあれば)についてはほとんど説明されていません。バグを説明する何百もの論文がありますが、変更を説明する文書(上記のように)はほとんど役に立ちません。 すべての処理がわからない場合、過去の変更を文書化するにはどうすればよいですか?私は文書化して起動することができますどのような我々が変更されました:私たちは仕事にシステムを持っている必要があるファイル、データベーステーブルECTを。私たちが何をするかを文書化することもできます。レポートが実行されるとき、なぜ人々がXレポート/プログラムを使用するように言われたか。しかし、これらのカスタマイズされたものの1つに問題がある場合、私はいつも元の状態に戻ります。 自分や他の人のために、この情報を積極的に文書化するにはどうすればよいですか?

3
初心者プログラマを支援するときに適切な語彙
私は初心者のプログラマーを比較的頻繁に助けています。彼らが尋ねたときに彼らのコードが機能しない理由を説明し、解決策などを提案します。私が支援している人々は、Javaの1年次の学位レベルのモジュールからプログラミングの正式な教育を受けていますが、彼らとうまくコミュニケーションをとることができないように感じます。 たとえば、関数を記述しても、なぜそれが実行されないのか理解できず、関数を呼び出すのを忘れたことに気付かない場合があります。私のようなフレーズを使用した場合"(make a) call (to) the function/it"と"pass it the.."、私は空白のルックスを取得します。 私の通常のプロセスは、コード内で言語から関数を呼び出す場所を見つけ、この他の関数を呼び出すのと同じ方法で独自の関数を呼び出すことができることを伝えることです。時にはそれも空白の外観になります。 初心者プログラマを支援するのにより適した(より良い?)語彙は他にありますか?それともコミュニケーションの問題ではないのですか?

4
2つの引数のみでPHPの三項演算子を使用する
私は最近、いくつかのコードをレビューしていましたが、ぼんやりとした感覚で、次のような構造を残していることに気付きました。 $guid = empty($subscription->guid) ? : $subscription->guid; さて、これはそれがはずのものをやっていなかったとされ、間違ったが、そのプロパティは常に設定されましたので、それは罰金を働いていた、と理由の5.3以来、何の構文エラーがない、次の変更は: PHP 5.3以降、三項演算子の中間部分を省略することが可能です。式expr1?:expr1がTRUEと評価された場合、expr3はexpr1を返し、そうでない場合はexpr3を返します。 私はこの変更を認識していませんでしたが、今、それを使用する必要があるかどうかに興味があります。これは私が痛んで、あなたが例えばを行うことができますルビーのような言語から欠落していたものですa = b || cいずれかを取得するbかcではなく、「本当の」ブール。ただし、3項演算子に選択した構文は、私には少し直観に反しているようです。これを製品コードで使用する必要がありますか?偶然見た時は間違いなく自分を投げました。

5
拡張子のないC ++ヘッダーファイルを使用することは良い習慣ですか?
私が従うべきC ++ガイドラインに関して私の同僚と議論があります。 彼は現在、すべてのライブラリをそのように設計しています。 彼はファイル名に一貫性のない大文字と小文字を使用しています 彼のヘッダーの一部には拡張子がありません 拡張子がないことはC ++標準ファイル用に予約されているものであり、大文字を使用するとエラーが発生しやすくなると考えています(特に、WindowsとLinuxの両方で機能するコードを扱う場合)。 彼のポイントは、彼がQt(Qtを使用しないコードの場合でも)慣例に従い、「Qtがそのように実行する場合、それは悪いことではない」と言い続けることです。 今、私はオープンマインドを保つようにしていますが、彼のライブラリで/彼のライブラリで作業しなければならないときは本当に気分が悪いです。これに関して共通して確立された一連のルールはありますか?標準はそれについて何かを教えていますか? どうもありがとうございました。
9 c++  naming 

2
DDDについて言及する場合の「ドメイン」の意味
駆動設計/開発に関してドメインという言葉は何を意味しますか? 意味論や学術的定義の観点からではなく、プロセスや哲学をどのように修正するかという観点からですか? 私は投稿を読んでいました:https : //softwareengineering.stackexchange.com/questions/57828/your-software-problem-solution-approach 私はこの流行語DDDに出くわし、それが何を意味するのか本当に知りませんでした。

2
自分のアプリケーションでExchange Serverの「RBAC AuthZ」を模倣しています…(同様のものはありますか?)
Exchange 2010には委任モデルがあり、winrmコマンドレットのグループは本質的に役割にグループ化され、役割はユーザーに割り当てられます。 (画像ソース) これは、適切な低レベルのテクノロジ(WCF、SOAPなど)を使用し、クライアント側に追加のソフトウェアを必要とせずに、PowerShellのすべての利点をどのように活用できるかを考慮した、優れた柔軟なモデルです。 (画像ソース) 質問 .NETアプリケーションでExchangeの委任モデルを活用する方法はありますか? このモデルを模倣しようとした人はいますか? 最初から始めなければならない場合、このアプローチを模倣するにはどうすればよいですか?

8
try-finally(catchなし)とenum-state検証の使用
私はこの質問について、例外が発生した場所にできるだけ近いところで例外を処理する方法についてのアドバイスを読んでいます。 ベストプラクティスのジレンマは、try / catch / finallyを使用してenum (または値を表すint、エラーの場合は0、OKの場合は1、警告の場合は2など)を返す必要があるかどうかです。答えは常に正しいですか、それとも呼び出し側がそれを処理するように例外を通過させるべきですか? 私が集めることができるものから、場合によってはこれが異なるかもしれないので、元のアドバイスは奇妙に思えます。 たとえば、Webサービスでは、常に状態を返す必要があるため、例外はその場で処理する必要がありますが、http経由でデータを投稿/取得する関数内で、例外(たとえば404の場合)は、それを起動したものにパススルーするだけです。そうでない場合は、結果の品質(エラー:404)と結果自体を呼び出し側に通知する方法を作成する必要があります。 データを取得/ポストするヘルパー関数内で404例外をキャッチすることは可能ですが、そうする必要がありますか?smallintを使用してプログラムの状態を示し(もちろん、それらを適切に文書化し)、この情報を外部の健全性検証の目的(すべてok /エラー処理)に使用するのは私だけですか? 更新:メインの分類で致命的または致命的でない例外を予期していましたが、回答を害しないようにこれを含めたくありませんでした。質問が何であるかを明確にしましょう:例外をスローするのではなく、スローされる例外を処理します。望ましい結果とは:エラーを検出し、エラーからの回復を試みます。復旧できない場合は、最も意味のあるフィードバックを提供してください。 ここでも、http get / postの例での問題は、元の呼び出し元に何が起こったかを説明する新しいオブジェクトを提供する必要があるかということです。このヘルパーが使用しているライブラリにあった場合、操作のステータスコードを提供することを期待しますか、それともtry-catchブロックに含めますか?設計している場合、ステータスコードを提供するか、例外をスローして、代わりに上位レベルにステータスコード/メッセージに変換させますか? あらすじ:例外を生成するのではなく、コードの一部がステータスコードと、コードが生成する結果を返す場合、どのように選択しましたか?

5
正規表現なしの字句解析
私はさまざまな上位レベルの言語(とりわけPython、PHP、Javascript)でいくつかのレクサーを調べてきましたが、それらはすべて何らかの形で正規表現を使用しているようです。正規表現がおそらくこれを行うための最良の方法であると確信していますが、正規表現なしで基本的な字句解析を達成する方法、おそらく何らかの直接文字列解析などがあるのか​​と思っていました。 ですから、どのような形でも正規表現を使用せずに、高水準言語*である種の基本的な字句解析を実装することは可能ですか? * Perl / PHP / Python / Javascriptなどの高レベル言語。Cでそれを行う方法は確かにあります

6
ソリューションが効率的なものであることは重要ですか?
私は多くの問題を解決します。主にトップコーダーからです。私は多くの回答を得ますが、ほとんどの場合、非効率的な解決策になってしまいます。 実際の実装では、問題の解決策が効率的であることが本当に重要ですか?もしそうなら、どうすればそれを改善できますか?

1
暗黙的インターフェイスと明示的インターフェイス
コンパイル時のポリモーフィズムと実行時のポリモーフィズムの実際の制限を理解していると思います。しかし、明示的なインターフェイス(実行時の多態性、つまり仮想関数とポインタ/参照)と暗黙的なインターフェイス(コンパイル時の多態性、つまりテンプレート)の概念的な違いは何ですか。 私の考えでは、同じ明示的インターフェースを提供する2つのオブジェクトは同じタイプのオブジェクトである(または共通の祖先を持っている)必要がありますが、同じ暗黙的インターフェースを提供する2つのオブジェクトは同じタイプのオブジェクトである必要はありません。両方が提供するインターフェースは、まったく異なる機能を持つことができます。 これについて何か考えはありますか? また、2つのオブジェクトが同じ暗黙のインターフェイスを提供する場合、これらのオブジェクトがそのインターフェイスを宣言する基本オブジェクトから継承しないようにする理由(仮想関数ルックアップテーブルなどの動的ディスパッチが不要であるという技術的な利点以外)それを明示的なインターフェースにしていますか?別の言い方をすると、同じ暗黙のインターフェースを提供する(したがって、サンプルテンプレートクラスの型として使用できる)2つのオブジェクトが、そのインターフェースを明示的にする基本クラスから継承しないようにできますか? 関連する投稿: https://stackoverflow.com/a/7264550/635125 https://stackoverflow.com/a/7264689/635125 https://stackoverflow.com/a/8009872/635125 この質問をより具体的にする例を次に示します。 暗黙的なインターフェース: class Class1 { public: void interfaceFunc(); void otherFunc1(); }; class Class2 { public: void interfaceFunc(); void otherFunc2(); }; template <typename T> class UseClass { public: void run(T & obj) { obj.interfaceFunc(); } }; 明示的なインターフェース: class InterfaceClass { public: virtual void …

3
「現実の世界」における疎結合/密結合の理解
公平な説明が欲しいので「コミュニティ」とは言いませんが、再利用可能なモジュールを作成していて、そのモジュールに3つ以上の依存モジュールが必要で、そのうちの1つを削除すると、アプリとしてだけでなく、このモジュールを使用する全体ですが、モジュール自体です。 私の理解(これは間違っているに違いない)から、疎結合のモジュラーシステムは、1つのモジュールを削除するだけでは壊れません。アプリは引き続き実行する必要がありますが、その「機能」/モジュールがなくても、依存するモジュールが存在しないために、モジュール自体がすべてを実行してはなりません。 これは間違っていますか?もしそうなら、モジュールがまだ機能していないすべての点に依存している場合、密結合と疎結合の違いは何ですか?

4
子ステートマシンは、どのようにして制御を親ステートマシンに戻すことができますか?
私のトップレベルのステートマシンには、いくつかのステートとエッジがあります。これを親ステートマシンと呼びます。 A ----> B ----> C 親ステートマシン内のどのステートもステートマシンにすることができます。これらの子供をステートマシンと呼びます。 ___________ / \ A ----> | B0->B1->B2 | ----> C \____________/ 親ステートマシンがAからBに移行すると、Bのステートマシンが引き継ぎます。Bの実行が完了したら、制御を親の状態マシンに放棄し、状態Cに移行するにはどうすればよいですか?どのデザインパターンを使用していますか? 疑問に思うかもしれませんが、私は親の状態マシン内に子の状態マシンを持っています。私の正確なプロジェクトは非常に複雑であり、子の状態の内部動作をカプセル化するのは自然だからです。

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