タグ付けされた質問 「complexity」

複雑さは、コードの複雑さを計算するさまざまな形式を扱います。循環的複雑度、nパス複雑度、Big O時間および空間複雑度。

5
計算の複雑さの概念はソフトウェア開発者にとって重要ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私は時間と記憶の複雑さの概念はcompsciコースの卒業生にとって必須であるという印象を受けていましたが、工学を勉強していたので、その場合は知識がありません。私は最近、概念さえ知らない地元の大学の卒業生の何人かにインタビューして驚いた。私の質問は: 計算の複雑さの概念はソフトウェア開発者にとって重要ですか?そして、それは学部課程で教えられるべきですか?

10
自明なソフトウェアと自明でないソフトウェアを区別する方法 [閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 それでは、プログラムを本当に簡単にするものは何でしょうか? 「些細なソフトウェア」がプログラミングの議論で頻繁に使用されていない限り。「何かが重要なソフトウェアであるために重要なのか」または「何かが非常に重要になったために重要なソフトウェアであるのか」を本当に理解できないという意味で、私はそれを非常にあいまいにしています。 たとえば、ユニットテストの問題については、「ユニットテストが必要な場合を除いて」とよく耳にします。
11 complexity 

2
特徴の交差の扱い
最近、フィーチャー交差に関するこの記事で説明されているものと同様の問題がますます多く見られます。私は通常、これらの問題を可能な製品構成の形で遭遇するのに対して、私はこれらを実際には異なる製品に帰する傾向があるものの、製品ラインと呼ぶこともあります。 このタイプの問題の基本的な考え方は単純です。製品に機能を追加しますが、他の既存の機能の組み合わせにより、どういうわけか物事は複雑になります。最終的に、QAは、これまで誰も考えていなかった機能のまれな組み合わせの問題を発見し、単純なバグ修正であったはずのものが、大きな設計変更が必要になることさえあります。 この機能の交差問題の側面は、驚くほど複雑です。現在のソフトウェアバージョンにN機能があり、1つの新しい機能を追加するとします。また、各機能をオンまたはオフにすることしかできず、2^(N+1)考慮できる機能の組み合わせがすでにあると言って、説明を簡略化しましょう。表現や検索用語が不足しているため、これらの組み合わせの存在を特徴の交差問題と呼んでいます。(より確立された用語のリファレンスを含む回答のボーナスポイント)。 ここで私が苦労している問題は、開発プロセスの各レベルでこの複雑な問題にどのように対処するかです。明らかなコスト上の理由から、それぞれの組み合わせに個別に対応することは、ユートピア的なところまでは非現実的です。結局のところ、私たちは正当な理由で指数関数的な複雑さのアルゴリズムに近づかないようにしていますが、開発プロセスそのものを指数関数的なサイズのモンスターに変えることは、まったくの失敗につながるはずです。 では、予算を爆発させず、まともな、有用な、専門的に受け入れられる方法で完全な体系的な方法で最良の結果を得るにはどうすればよいでしょうか。 仕様:新しい機能を指定する場合、他のすべての子とうまく機能することをどのように保証しますか? 既存の各機能を新しい機能と組み合わせて体系的に検査できることがわかりますが、それは他の機能とは切り離されています。一部の機能の複雑な性質を考えると、この分離されたビューはすでに非常に複雑であることが多いため2^(N-1)、他の機能によって引き起こされた要因はもちろん、それ自体が構造化されたアプローチを必要としています。 実装:機能を実装する場合-すべてのケースでコードが適切に相互作用/交差することをどのように保証しますか。 繰り返しますが、私は純粋な複雑さについて疑問に思っています。2つの交差する機能のエラーの可能性を減らすためのさまざまな手法を知っていますが、妥当な方法で拡張できる手法はありません。ただし、仕様中の優れた戦略により、実装中は問題を回避できると思います。 検証:フィーチャーをテストする場合、このフィーチャーの交差スペースの一部しかテストできないという事実にどのように対処しますか? 単一の機能を分離してテストしても、エラーのないコードの近くには何も保証されないことを知るのは十分に困難ですが、これを2^-N数分の1に減らすと、何百ものテストがすべての海洋の1滴の水をカバーしていないように見えます。さらに悪いことに、最も問題のあるエラーは、フィーチャの交差に起因するエラーであり、問​​題につながるとは予想されませんが、そのような強い交差が予想されない場合、これらのエラーをどのようにテストしますか? 他の人がこの問題をどのように扱っているかを聞きたいのですが、私は主にこのトピックをより深く分析する文学や記事に興味があります。そのため、個人的に特定の戦略に従う場合、対応するソースを回答に含めるとよいでしょう。

2
コードの複雑さと開発者の生産性の間には相関関係がありますか?
開発者の生産性の観点から、コードベースのリファクタリングに費やした時間は、長期的に見て価値がありますか? クリーンで適切に設計されたシステムを変更することは、設計が不十分なシステムで作業するよりもはるかに単純かつ高速であることは私にはかなり明らかですが、確かな証拠があります。このトピックに関する研究はありますか?

4
クラスの複雑さを軽減する
私はいくつかの回答を見て、Googleで検索しましたが、役立つ情報は見つかりませんでした(つまり、厄介な副作用はありません)。 私の問題は、要約すると、オブジェクトがあり、それに対して長い一連の操作を実行する必要があることです。自動車をつくるような組み立てラインのようなものだと思います。 これらのオブジェクトはメソッドオブジェクトと呼ばれると思います。 したがって、この例では、ある時点でCarWithoutUpholsteryがあり、その上でinstallBackSeat、installFrontSeat、installWoodenInsertsを実行する必要があります(操作は相互に干渉せず、並列で実行されることもあります)。これらの操作はCarWithoutUpholstery.worker()によって実行され、CarWithUpholsteryとなる新しいオブジェクトを生成します。このオブジェクト上で、おそらくcleanInsides()、verifyNoUpholsteryDefects()などを実行します。 単一フェーズでの操作は既に独立しています。つまり、私はすでに、それらのサブセットを任意の順序で実行できるように取り組んでいます(前部座席と後部座席は任意の順序でインストールできます)。 私のロジックは現在、実装を簡単にするためにリフレクションを使用しています。 つまり、CarWithoutUpholsteryを取得すると、オブジェクトは、performSomething()と呼ばれるメソッドについてそれ自体を検査します。その時点で、これらのメソッドをすべて実行します。 myObject.perform001SomeOperation(); myObject.perform002SomeOtherOperation(); ... エラーやものをチェックしながら。操作の順序は重要ではありませんが、結局、何らかの順序が重要であることがわかった場合に備えて、辞書式順序を割り当てました。これはYAGNIと矛盾しますが、コストはごくわずか(単純なsort())で、大規模なメソッドの名前変更(またはメソッドの配列など、テストを実行する他のメソッドを導入すること)を節約できます。 別の例 車を製造する代わりに、誰かに関する秘密警察の報告書を編集し、それを私の悪の支配者に提出しなければならないとしましょう。最後のオブジェクトはReadyReportです。それを構築するために、基本的な情報(名前、姓、配偶者...)を収集することから始めます。これは私のフェーズAです。配偶者の有無に応じて、フェーズB1またはB2に進み、1人または2人の性別データを収集する必要があります。これは、ナイトライフ、ストリートカム、セックスショップの売上レシートなどを制御するさまざまなEvil Minionsに対するいくつかの異なるクエリで構成されています。などなど。 被害者が家族を持たない場合、私はGetInformationAboutFamilyフェーズに入ることさえしませんが、そうする場合、私が最初に父親、母親、または兄弟(もしあれば)をターゲットにするかどうかは関係ありません。しかし、FamilyStatusCheckを実行していない場合はそれを行うことができません。したがって、これは以前のフェーズに属します。 すべてうまくいきます... 追加の操作が必要な場合は、プライベートメソッドを追加するだけです。 操作がいくつかのフェーズに共通している場合、スーパークラスから継承させることができます。 操作はシンプルで自己完結型です。ある操作の値が他の操作で必要になることはありません(実行する操作は別のフェーズで実行されます)。 作成者オブジェクトがそもそもこれらの条件を検証していなかった場合、それらは存在することさえできなかったため、将来のオブジェクトは多くのテストを実行する必要はありません。つまり、ダッシュボードにインサートを配置し、ダッシュボードをクリーニングし、ダッシュボードを確認するときに、ダッシュボードが実際にそこにあることを確認する必要はありません。 簡単にテストできます。私は簡単に部分オブジェクトをモックして、その上で任意のメソッドを実行でき、すべての操作は確定的なブラックボックスです。 ...だが... 問題は、メソッドオブジェクトの1 つに最後の操作を1つ追加したときに発生しました。これにより、モジュール全体が必須の複雑度インデックス(「N未満のプライベートメソッド」)を超えました。 私はすでにこの問題を2階で取り上げており、この場合、豊富なプライベートメソッドは災害の兆候ではないことを示唆しています。複雑さはあるが、しかし操作はので、それがありますされ、複雑な、そして実際に、それはすべてが複雑ではない-それだけだ長いです。 Evil Overlordの例を使用すると、私の問題は、Evil Overlord(別名拒否されるべきではない彼)がすべての食事情報を要求したことです。所有者など、そして悪(サブ)オーバーロード- 否定されるべきではない彼としてよく知られている-は、GetDietaryInformationフェーズで実行するクエリが多すぎると不平を言っています。 注:私はいくつかの観点からこれがまったく問題ではないことを認識しています(考えられるパフォーマンスの問題などを無視します)。起こっていることは、特定の測定基準が不幸であるということだけであり、それには正当化の余地があります。 何だと思い、私が行うことができます 最初のものを除いて、これらのオプションはすべて実行可能であり、防御可能だと思います。 私はこっそりできることを確認し、メソッドの半分を宣言しますprotected。しかし、私はテスト手順の弱点を利用しているので、捕まったときに自分自身を正当化することは別として、私はこれが好きではありません。また、それは応急措置です。必要な操作の数が2倍になった場合はどうなりますか?可能性は低いですが、それではどうでしょうか。 このフェーズを任意にAnnealedObjectAlpha、AnnealedObjectBravo、AnnealedObjectCharlieに分割し、各ステージで3分の1の操作を実行できます。これは実際には複雑さを増す(N-1クラス増える)という印象の下にあり、テストに合格する以外に利点はありません。もちろん、CarWithFrontSeatsInstalledとCarWithAllSeatsInstalledは論理的に連続したステージであると私は考えることができます。後でAlphaがBravoメソッドを必要とするリスクは小さく、うまく使えばさらに小さくなります。それでも。 リモートで類似したさまざまな操作を1つの操作にまとめることができます。performAllSeatsInstallation()。これはあくまで暫定的な措置であり、単一操作の複雑さが増します。操作AとBを異なる順序で実行する必要があり、E =(A + C)とF(B + D)内にそれらをパックした場合、EとFをアンバンドルしてコードをシャッフルする必要があります。 ラムダ関数の配列を使用して、チェックを完全に回避できますが、それは不格好です。ただし、これはこれまでのところ最良の代替手段です。それは反射を取り除くでしょう。私が抱えている2つの問題は、仮説だけでなく、すべてのメソッドオブジェクトを書き換えるように求められることです。これはCarWithEngineInstalled非常に優れたジョブセキュリティですが、それほど魅力的ではありません。また、コードカバレッジチェッカーにはラムダに関する問題があります(これは解決可能ですが、まだ問題です)。 そう... あなたは、どちらが私の最良の選択肢だと思いますか? 私が考慮していないより良い方法はありますか?(たぶん、私はきれいに来て、それが何であるかを直接尋ねた方がいいですか?) この設計にはどうしようもない欠陥があり、私は敗北と溝掘りを認めるべきです-このアーキテクチャは完全にそうですか?私のキャリアには良くありませんが、長期的には、設計が不適切なコードを書く方が良いでしょうか? 私の現在の選択は実際にはOne True Wayであり、より良い品質のメトリック(および/またはインストルメンテーション)をインストールするために戦う必要がありますか?この最後のオプションについては、参照が必要です...つぶやいているときに@PHBで手を振るだけでは、これらは探しているメトリックではありません。いくらでもやりたい

6
フィールドとメソッドの引数[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前休業。 私は新しいクラスを書き始めたばかりで、厳密には必要のないメソッド引数をたくさん追加していることに気付きました。これは、クラスの一般的な構成や依存関係ではなく、特定のメソッド呼び出しに固有のクラス内の状態を回避する習慣に従っています。 そうすることは、引数を持たない可能性のある多くのメソッドが1、2、または3で終わることを意味します。 このトレードオフについてどう思うか、どのような状況でどのアプローチを取るかをどのように決定するかについて、あなたの意見を聞きたいのですが。 コードを説明するとき、コードは英語よりも理解しやすいことが多いため、両方のバリアントを含む小さな要点を作成しました:https : //gist.github.com/JeroenDeDauw/6525656

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(); …

5
O(n)のサフィックス配列を使用した文字列の最小の辞書式回転
ACM 2003の問題を引用します。 長さn(1 <= n <= 100000)の文字列を考えます。その最小の辞書式回転を決定します。たとえば、文字列「alabala」のローテーションは次のとおりです。 アラバラ ラバラ アバラール バラアラ アラララブ ラアラバ あらばる その中で最小のものは「aalabal」です。 解決策として-私はサフィックス配列を構築する必要があることを知っています-そして、O(n)でそれを行うことができるとしましょう。私の質問はまだ、どうすればO(n)の最小回転を見つけることができますか?(n =文字列の長さ) 私はこの問題に非常に興味がありますが、それでも解決策が得られません。具体的な実装ではなく、概念と問題の解決方法に興味があります。 注:最小回転とは、英語の辞書と同じ順序であることを意味します。dはwの前にあるため、「dwor」は「word」の前にあります。 編集:サフィックス配列の構築にはO(N)が必要です 最終編集:解決策を見つけたと思います!!! 2つの文字列をマージした場合はどうなりますか?文字列が "alabala"の場合、新しい文字列は "alabalaalabala"になり、これのサフィックス配列(O(2n)= O(n)内)を作成して最初のサフィックスを取得しますか?これは正しいと思います。どう思いますか?ありがとうございました!

1
限られた予算でのビザンチン決済処理コードのリファクタリング[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 私は数年間、大規模なRuby on Railsアプリケーションに取り組んできました。それは貧しい状態で受け継がれましたが、生産バグのほとんどは時間とともに解決されました。支払い処理コードなど、変更されていないセクションがあります。このコードはほとんどの部分で機能しますが、支払い処理業者によって請求が拒否された場合は常に、ユーザーに役立つメッセージではなく500エラーが表示されます。保守を容易にするためにコードをリファクタリングしたいと思います。それがどのように機能するかの簡単な概要を提供します。 次のスニペットからすべてのエラー処理コードを削除しました。 迷路はコントローラーで始まります: def submit_credit_card ... @credit_card = CreditCard.new(params[:credit_card].merge(:user => @user)) @credit_card.save ... @submission.do_initial_charge(@user) ... end 次に、Submissionモデルで: def do_initial_charge(user) ... self.initial_charge = self.charges.create(:charge_type => ChargeType.find(1), :user => user) self.initial_charge.process! self.initial_charge.settled? end ではChargeモデル: aasm column: 'state' do ... event :process do transitions :from => [:created, :failed], …

2
単一のforループランタイム説明問題
さまざまなforループの実行時間を分析しています。知識が増えてきているので、この問題を理解したいと思っています。この問題は、まだ解明されていません。「エクササイズされる星の数」というこのエクササイズがあります。 for (int i = N; i > 1; i = i/2) System.out.println("*"); 選ぶべき答えは A: ~log N B: ~N C: ~N log N D: ~0.5N^2 答えはAであるべきと私はそれに同意するが、他の側に..ましょうと言うが、それでN = 500何を考えLog N、その後も?2.7になります。では、N=500上記の演習でそれを言うとどうなるでしょうか。それは間違いなく2.7以上の星を印刷するでしょうか?それはどのように関連していますか? forループが次のようになっていると言うのは理にかなっているからです。 for (int i = 0; i < N; i++) N星を印刷します。 私はここでこれについての説明を見つけたいと思っています。多分私はこれらすべてのことを間違って解釈し、それについて悪い方法で考えています。前もって感謝します。

2
無駄な複雑さを制御するために、開発環境に正式な役割(内部または外部)を割り当てる必要がありますか?
数年前、私は社内のフレームワークの開発にこれまで取り組んできた小さな会社で働いていました。彼らは彼らの最上級の開発者とそのアーキテクトをカスタムMVCフレームワークとORMをゼロから開発することに専念していました。これらの2つは、コア製品と直交しています。残念ながら、このフレームワーク主導のアプローチのサポートは上から来たものであり、収益を生み出すソフトウェアの配信を遅らせました。そして、生成されたフレームワークは、既製の代替品よりも著しく劣り、遅延をさらに悪化させました。会社はすぐに現金を使い果たし、最終的には全員が解雇された。 後の雇用主も同様のミスを犯しました-彼らは非常に技術的に熟練した開発者-完璧主義者を手に入れました。このソリューションは、他の顧客に合わせて拡張することができます。プロジェクトは大幅に実行されました。しかし、他の潜在的な顧客は少しもしません。金運の戦略的失敗、それは少額の財産です。 どちらの場合も、かなりの量のオーバーエンジニアリングがありました。どちらの場合も、会社とプロジェクト管理は、プログラミングのバックグラウンドではなく、ドメインまたは分析のバックグラウンドを持つ人々でした。どちらの場合も、ソフトウェアアーキテクトは過度に複雑なソリューションを構築して、かゆみを掻き消し、履歴書を強化しました。どちらの場合も、アーキテクトはコストを抑えることに利害関係がありませんでした(会社が倒産した場合に仕事を失うリスクは別として、それは彼らの高いエンプロイアビリティを考慮するとそれほどリスクはありませんでした)。 私の経験によれば、開発ショップが陥るのは珍しいことではありません。 正式な内部または外部の技術的な敵対的な役割-「量測量者」-建物のアナロジーを使用して、無駄なオーバーエンジニアリングを呼び出したり、防止したりするためのソフトウェアプロジェクトの場所はありますか?この役割を果たすのに最適なのは誰ですか?

4
SQLステートメントからロジックを移動するのは良い考えですか?
私はプロのソフトウェア開発者にとって非常に新しいと言って、この質問の前置きをします。 私は社内の他のグループからデータを受け取り、このデータをビジネスエグゼクティブが使用できるレポートに変換するチームで作業しています。 データの転送と解析の過程で、データの多くの処理を行ういくつかのSQLステートメントがあります。ほぼすべてのSELECT用途はTRIM、SUBSTR、CASTなど広範囲に適切なサイズや形式にフィールドを軽減します。さらに、CASE内SELECTのステートメントを使用することで説明される特別なケースがたくさんあります。 私たちが使用するTeradataサーバーソフトウェアは、非常にわかりにくいエラーメッセージを出力します。その結果、どのデータがどのSQLステートメントを壊しているかについて、多くの推測を行います。 私の質問は、これらのやや複雑なSQLステートメントを、処理と特殊なケースの処理を省略した、より複雑でない形式に減らし、代わりにこれを外部のスクリプトまたはプログラムで実行することは良い考えでしょうか?これは意味がありますか?
8 sql  complexity 

1
Webアプリケーションの複雑さ
私は現在、Webアプリケーションの保守性に関する修士論文を書いています。Colemanらによる「Maintainability Index」のようないくつかの方法を見つけました。またはMuthannaらによる「ソフトウェア保守性インデックス」。どちらの場合も、循環的複雑度を計算する必要があります。だから私の質問は: Webアプリケーションの循環的複雑度を測定することは可能ですか? 私の意見では、Webアプリケーションには3つの部分があります。 サーバーコード(PHP、C#、Python、Perlなど) クライアントコード(JavaScript) HTML(演算子としてのリンクとフォーム、オペランドとしてのGETパラメータとフォームフィールド!?) どう思いますか?Webアプリケーションの複雑さについて別の見方がありますか?私は何か見落としてますか?

3
アレイを拡大するには何枚のコピーが必要ですか?
動的配列の分析を読んでいます(Skienaのアルゴリズムマニュアルから)。 つまり、配列構造があり、スペースがなくなるたびに、元のサイズの2倍のサイズの新しい配列を割り当てます。 これは、アレイのサイズを変更する必要があるときに発生する無駄について説明しています。 これは、(n / 2)+1からnまでが最大で1回移動されるか、まったく移動されないことを示しています。これは明らかです。 次に、要素の半分が1回移動し、要素の4分の1が2回移動する、などと記述すると、移動の総数Mは次のようになります。 これは実際に起こるよりも多くのコピーを追加するように私には思えます。 例えば 以下の場合: array of 1 element +--+ |a | +--+ double the array (2 elements) +--++--+ |a ||b | +--++--+ double the array (4 elements) +--++--++--++--+ |a ||b ||c ||c | +--++--++--++--+ double the array (8 elements) +--++--++--++--++--++--++--++--+ |a ||b ||c ||c …

4
ネストされたループのBig-O
Big-Oでこの投稿を読ん でいます。次のコードはO(n ^ 2)であると表示されています。 bool ContainsDuplicates(String[] strings) { for(int i = 0; i < strings.Length; i++) { for(int j = 0; j < strings.Length; j++) { if(i == j) // Don't compare with self { continue; } if(strings[i] == strings[j]) { return true; } } } return false; } しかし、なぜか分かりません。 …

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