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

リファクタリングは、既存のコード本体を再構築し、外部の動作を変更せずに内部構造を変更するための統制のとれた手法です。

1
Pythonの「神クラス」をリファクタリングする方法は?
問題 私は、メインクラスが少し「神オブジェクト」であるPythonプロジェクトに取り組んでいます。そこされているので、多くの属性とメソッドのfrigginの! クラスをリファクタリングしたい。 これまでのところ… 最初のステップとして、私は比較的単純なことをしたいと思います。しかし、最も簡単な方法を試したところ、いくつかのテストと既存の例が破られました。 基本的に、クラスには属性のリストがたくさんありますが、私はそれらをはっきりと見て、「これらの5つの属性は関連しています...これらの8つの属性も関連しています...そして残りはあります」と考えることができます。 getattr 基本的に、関連する属性をdictのようなヘルパークラスにグループ化したかっただけです。__getattr__その仕事に理想的だと感じました。それで、属性を別のクラスに移動し、確かに、__getattr__その魔法は完全にうまくいきました… で、最初に。 しかし、私は例の1つを実行してみました。サンプルのサブクラスは、これらの属性の1つを直接(クラスレベルで)設定しようとします。しかし、属性が親クラスで「物理的に配置」されなくなったため、属性が存在しないというエラーが表示されました。 @property 次に、@propertyデコレータについて読みます。しかし、それが親クラスのプロパティであるself.x = blah場合に実行したいサブクラスに問題が発生することも読みましたx。 望ましい self.whatever親のwhateverプロパティがクラス(またはインスタンス)自体に「物理的に」配置されていない場合でも、すべてのクライアントコードがを使用して機能し続けるようにします。 関連する属性をdictのようなコンテナにグループ化します。 メインクラスのコードの極端なノイズを減らします。 たとえば、これを単に変更したくありません。 larry = 2 curly = 'abcd' moe = self.doh() これに: larry = something_else('larry') curly = something_else('curly') moe = yet_another_thing.moe() …それはまだうるさいからです。これにより、simple属性がデータを管理できるものにうまく変換されますが、元の変数には3つの変数があり、調整されたバージョンにはまだ3つの変数があります。 しかし、私はこのようなもので大丈夫でしょう: stooges = Stooges() そして、のルックアップがself.larry失敗した場合、何かがチェックされstooges、larryそこにあるかどうかが確認されます。(ただし、サブクラスlarry = 'blah'がクラスレベルで実行しようとした場合にも機能する必要があります。) 概要 親クラスの属性の関連グループを、他の場所にすべてのデータを格納する単一の属性に置き換えたい larry = …

4
log4jをslf4jにアップグレードする必要がありますか?[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 5年前休業。 私たちは、いくつかの計画リファクタリングのための私達のJEE Webアプリケーションを検討していると提案の一つは、交換することであるlog4jとlogbackか、slf4j チームはこれを行うべきかどうか明確ではありません。現在壊れていない場合はフォローしたいので、この領域では修正しないでください。 編集:私はロギングフレームワークの比較を求めていませんが、log4jに非常に満足しているときにフレームワークを変更することがリファクタリングの要素であるかどうかを尋ねています

3
チームでの名前変更、リファクタリング、変更の破棄に関するベストプラクティス
チーム環境でのリファクタリングと名前変更のベストプラクティスは何ですか?いくつかのシナリオを念頭に置いてこれを取り上げます。 一般に参照されるライブラリがリファクタリングされ、それを参照するライブラリまたはプロジェクトに重大な変更が導入された場合。たとえば、メソッドの名前を任意に変更します。 プロジェクトの名前が変更され、ソリューションへの参照を更新してソリューションを再構築する必要がある場合。 フォルダを導入し、既存のプロジェクトまたはソリューションを新しい場所に移動することにより、プロジェクト構造が「より整理された」ものに変更された場合。 いくつかの追加の考え/質問: この問題のような変化は、結果として生じる痛みが構造が正しくなくなったことを示しているのでしょうか? 重大な変更に関連するエラーを修正する責任は誰にあるべきですか?開発者が重大な変更を行った場合、影響を受けるプロジェクトに参加してそれらを更新する責任があるのか​​、それとも他の開発者に警告して変更を促すべきなのか? これは定期的に実行できるものですか、それともできるだけ頻繁に実行する必要があるものですか。リファクタリングがあまりにも長く延期されると、調整がますます困難になりますが、同時に1日を費やして1時間を費やして、他の場所で起こった変更のためにビルドを修正します。 これは正式なコミュニケーションプロセスの問題ですか、それとも有機的なものですか。

7
複雑なレガシーアプリに新しいバグを導入する確率を下げるために、どのようなアプローチを取ることができますか?
私が作業する場所では、コードが完全なスパゲッティである古いシステム(.NET 1)で開発(およびバグ修正)しなければならないことがよくあります-変​​数名、プログラム構造、コメントはほとんど考慮されていません。 このため、どのビットを変更する必要があるかを理解するには年齢がかかります。変更を加えたため、既存のソフトウェアを「壊す」ことがよくあります。私は本当に(同僚と)数か月かけてリファクタリングするのに費やしたいのですが、既存の開発者はどちらもニーズを理解できず、これに時間をかけることもできません(システムは巨大です)。 私が何かを修正するのに数日かかるので、私が他の何かを壊したことを発見するのに数日かかるので、私はそのコードに取り組む必要があることを恐れています。これは明らかに私を無能に見えるようにします-それで私はこれにどのように対処できますか?

7
コードのリファクタリングと最適化は、アジャイルとウォーターフォールの両方のプロセスタイムラインのどこに適合させるべきですか?
プロジェクトマネジメントチームの間では、「機能する」とは100%完成したものと見なす必要があることを意味するというこの考え方があるようです。ほとんどのプログラマーは、常にそうであるとは限らないことを知っています。機能の一部を機能させるために別のアプローチを試みている場合、それは必ずしも最良の解決策を見つけたことを意味するわけではありません。私はよく何かをやり終えて、一歩下がって、ビジネスルールが満たされた後、自分に何ができるかを自問します。この「もっと上手にできる」時間は、タイムライン内のどこかに実際に収まるでしょうか。私は、最良のアプローチは、コードを見つけたときよりも常に(ある程度)そのままにしておくことであると考えています。これは、リリース後のリファクタリングを意味する可能性があります。しかしながら、

3
設計パターンとリファクタリングを意図的に練習するにはどうすればよいですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 4年前休業。 私は「パターンへのリファクタリング」という本を読んでいて、パターンをリファクタリングして使用する新しい方法を意図的に練習しなければスキルが上がらないので、どうしたらスキルを練習できるのかと考えていました。 しかし、事務処理では、各タスクをできるだけ早く完了する必要があります。ほとんどの場合、プロジェクトのデザインとアーキテクチャは私が管理しているのではなく、既存のコードと同様のスタイルに従うしかありません。悪いデザインのプロジェクトがあることもありますが、デザインスキルが私よりも優れている別の開発者もいて、彼はプロジェクト全体をリファクタリングする計画をすでに持っているので、私は彼の計画に従っています。練習する機会を得るにはどうすればよいですか?

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で手を振るだけでは、これらは探しているメトリックではありません。いくらでもやりたい

4
リファクタリング-すべてのテストに合格する限り、単純にコードを書き直すことは適切ですか?
最近、RailsConf 2014の「All the Little Things」を視聴しました。この講演中に、Sandi Metzは、ネストされた大きなifステートメントを含む関数をリファクタリングします。 def tick if @name != 'Aged Brie' && @name != 'Backstage passes to a TAFKAL80ETC concert' if @quality > 0 if @name != 'Sulfuras, Hand of Ragnaros' @quality -= 1 end end else ... end ... end 最初のステップは、関数をいくつかの小さなものに分割することです: def tick case name when 'Aged …

5
長いメソッドのリファクタリング:そのままにするか、メソッドに分離するか、ローカル関数を使用する
私がこのような長い方法を持っているとしましょう: public void SomeLongMethod() { // Some task #1 ... // Some task #2 ... } このメソッドには、個別のメソッドまたはローカル関数に移動する必要がある繰り返し部分はありません。 長いメソッドはコードのにおいだと思っている人はたくさんいます(私を含めて)。また、私は#regionここで(s)を使用するのが好きではありません。なぜこれが悪いのかを説明する非常に人気のある答えがあります。 しかし、このコードをメソッドに分割すると public void SomeLongMethod() { Task1(); Task2(); } private void Task1() { // Some task #1 ... } private void Task2() { // Some task #1 ... } 次の問題が発生します。 単一のメソッドによって内部的に使用される定義でクラス定義スコープを汚染しているため、どこかに文書化する必要がTask1あり、そのTask2内部のみを対象としてSomeLongMethodいます(または、私のコードを読むすべての人がこのアイデアを推測する必要があります)。 単一のSomeLongMethodメソッド内で一度だけ使用されるメソッドの汚染IDEオートコンプリート(Intellisenseなど)。 このメソッドコードをローカル関数に分離すると …

1
深いアーキテクチャのリファクタリングを機能ベースの開発と組み合わせるより良い方法を探しています
問題文: 与えられた: ソース管理としてのTFS アーキテクチャ設計が悪いかほとんどないレガシーコードが大量にある重いデスクトップクライアントアプリケーション。 音質、高速 配信、常にユーザーに不親切なUIに不満を示す新機能を常に必要とするクライアント。 問題: アプリケーションは間違いなく、深いリファクタリングを必要とします。このプロセスは必然的にアプリケーションを不安定にし、専用の安定化フェーズが必要です。 私たちは試しました: マスター(MB)から機能ブランチ(FB)への定期的なマージによるマスターのリファクタリング。(私の間違い) 結果:多くの不安定なブランチ。 私たちがアドバイスされていること: 記事(pdf)へのリンク リファクタリング(RB)のための追加のブランチを作成し、MBからRBへのマージによって定期的にMBと同期します。RBが安定した後、マスターをRBに置き換え、さらにリファクタリングするための新しいブランチを作成します。これが計画です。しかし、ここでは、FBをMBにマージした後、MBをRBにマージすることの本当の地獄を期待しています。 主な利点: ほとんどの場合、安定したマスター。 収益のより良い代替案はありますか?

4
迅速なプロトタイピングとリファクタリング
小さなプロジェクト(Androidアプリなど)を開始するとき、最後にどのアプローチがうまくいくかわからないことがあるので、1つのアプローチを試してみます。しかし、このアプローチをこれまでに使用したことがない場合(ある種のアプリケーションの場合、これまでプログラムしたことがない)、それは未知の地形に足を踏み入れるようなものです。使用するライブラリがわからない(たぶん、いくつかのライブラリを試す必要があるかもしれません)非常に多くの認識されていない(例:Androidで生のオーディオデータを取得する方法) したがって、私の開発プロセスは次のようになります。 コードを記述して、アプローチにチャンスがあるかどうかを確認します。(アプローチが不確実であるほど、コードはより醜くなります) 機能する場合は、綺麗になるまでたくさんリファクタリングしてください この時点でソフトウェア設計を詳細に計画した場合、それは時間の無駄になると思います。それは、地図のない旅行を計画するようなものです。 これはアグリー開発の一部ですか?ソフトウェア開発で未知の地形にどのように対処しますか?

3
型コードをクラスで置き換える(リファクタリング[Fowler]から)
この戦略では、次のようなものを置き換える必要があります。 public class Politician { public const int Infidelity = 0; public const int Embezzlement = 1; public const int FlipFlopping = 2; public const int Murder = 3; public const int BabyKissing = 4; public int MostNotableGrievance { get; set; } } と: public class Politician { public MostNotableGrievance …
9 c#  refactoring 

6
2000年代のソフトウェアソリューションですが、すべてにパッチを適用するか、再作成する必要がありますか?
ある会社が現在利用しているシステムと、それをどうするかについて話し合った。 同社はさまざまなカートンディスプレイを製造しています。このシステムは、クライアント、注文、価格を追跡するために開発されました。システムが作成されてから多くのことが起こりましたが、システムは、マネージャーが説明したように、「ロックされている」と「問題がある」ので、私は「動的ではない」と「不安定」と解釈しています。 システムに関するいくつかの情報 2000年頃に開発されました かなり小規模なシステム、2〜5人のユーザー、6つのフォーム、平均量のデータを含む最大8つのテーブル 初期のVisual Basicに基づいて構築された、ドラッグアンドドロップデザインで作成されたフォーム。インターフェイスは基本的にメニューといくつかのフォームを備えた単なるウィンドウです MSSQLデータベース(SQL2005サーバー)を使用してデータとクエリ用のODBCドライバーを格納し、データがこのシステムの前にExcelから移行され、Excelの前に手動で処理され、計算され、記述された ユーザーはMicrosoft XP環境(およびそれ以上)で作業します 彼らの主な問題は、価格を調整および計算できない、新しいカートンタイプなどを正しく追加できない、サーバー上のデータにアクセスできない(または、方法がわからない)ため、もう正しくできないことです。 私は3つの可能な解決策を提案しました 現在のシステムにパッチを適用しようとする 新しい新しいインターフェースを作成します(できれば、同様の環境、VB.netまたはVBベース) 非常に小さなシステムであることを考慮して、Excelソリューションに戻します さらに多くのオプションがあるかもしれませんが、これらは私が考えることができるものです。 私の質問は 私は何を勧めるべきですか、そしてなぜですか? これらの代替案の長所と短所は何ですか? 他の(おそらくより良い)代替案はありますか?

7
LOC /日の比率が高すぎる場合、私は気にする必要がありますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 私は現在インディープロジェクトに取り組んでいるので、人間によるテストや外部コードのレビュー全体を行う余裕はありません。しかし、現在のコードに難しいバグはありません(私が見ているように修正しています) 、そしてほとんどの場合、フィールド名などが間違っているため、1〜2分で修正することができます)。機能を実装した後、プッシュする前にテストします。最近、私のLOC番号は1日あたり約400でした(実際には、C#です)。新しいシステムを実装するだけでなく、既に記述した内容を書き換えて、いくつかのバグを修正しています。 気にする必要がありますか?これまでに作成したすべてのコードを停止して確認し、リファクタリングする必要があるという兆候ですか?
9 c#  refactoring 

8
新しい機能を処理するためのデータベースのリファクタリングまたはアップグレード
データベーススキーマの質問に対するいくつかの回答は、現在の要件の一部ではない機能のデータベースを正規化するための追加のテーブルを提案しました(UserDepartmentテーブルは、従業員/ユーザーとそれらが異なる部門との多対多の関係を可能にします属します。) 正規化に反対ではありません。データベースの設計に関しては、誰かが将来的に望んでいると確信している機能を含めるように強く求められているようです。テーブル/フィールドをデータベースに追加して機能に対応することは、過度に設計する傾向があるので難しいですか?必要に応じて、他のアプリと同じようにリファクタリングまたはアップグレードされませんか?やり直しは決して楽しいものではありませんが、データをあるテーブルから新しいテーブルに移動することはできます。この考え方がどこで終わるのかわからない。 編集:これには多くの嫌悪感があります。データベースの大幅な変更を必要とする機能を追加しないプロジェクトや、新しいテーブルの代わりにDepartmentID2フィールドを追加するなどの非正規化されたアプローチがいくつあるのでしょうか?従業員が複数の部署を必要とすることは、よくあるドメインの問題です。多対多の関係で散らかされている多くのデータベーススキーマに気づかなかっただけです。

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