問題タブ [refactoring]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
287 参照

perl - 定数の重複を減らすにはどうすればよいですか?

構成ファイルの多くの定義済み定数を含むこの Perl スクリプトがあります。例えば:

「/etc/app1」と「/var/log」の重複を減らしたいのですが、変数を使用してもうまくいきません。また、以前に定義された定数の使用は、同じ「定数ブロックの使用」では機能しません。例えば:

動作しません。

別の「use constant」ブロックを使用すると、この問題を回避できますが、多くの不要なコードが追加されます。

これを行う正しい方法は何ですか?

ありがとうございました。

0 投票する
6 に答える
1615 参照

visual-studio - リファクタリングの方法: クラスを 2 つに分割し、インターフェイスを介して通信します

私は最初の大規模なリファクタリングに着手したばかりで、(残念ながら大きな) クラスを 2 つに分割する必要があり、それらはインターフェイスを介してのみ通信します。(私のプレゼンターはコントローラーであることが判明したため、アプリ ロジックから GUI ロジックを分離する必要があります)。VisualStudio 2008 と Resharper で C# を使用する場合、これを実現する最も簡単な方法は何ですか?

私がしようとしているのは、a)新しいクラスのメンバーを収集し、「新しいクラスを抽出する」 b)結果の混乱をクリーンアップする c)「インターフェイスを抽出する」 d)クラスへの参照を追跡し、それらをインターフェイス参照に変換することです

しかし、私はこれまでにこれを行ったことがなく、すべてをバラバラにする前に、誰かが何か良いヒントや落とし穴を知っているかどうか疑問に思っています...ありがとう!

0 投票する
9 に答える
697 参照

language-agnostic - リファクタリングの説明

質問

私の質問は、コードの整理とリファクタリングの方法と重要性をどのように教えられるかということです。

バックグラウンド

私は最近、同僚のコードレビューに取り組んでいました。彼らは、昔の同僚の仕事にいくつかの変更を加えていました。新しい変更の間、私の同僚はアイテムをリファクタリングしようとしましたが、クラッシュやその他の問題に遭遇するとすぐにあきらめました (問題の根本を見つけるためにウサギを追いかけるのではなく)、問題のコードを再実装し、その上にさらに構築しました。これにより、コードは回避策と魔法の番号のもつれに陥ったため、私は彼らと一緒に座ってリファクタリングを行いました。

リファクタリングできる場所を特定する方法と、各リファクタリングで新しい領域がどのように強調されるかを説明しようとしました。たとえば、同じ情報を格納する 2 つの変数があったとします。なぜでしょうか? より大きな問題の回避策だと思ったので、変数を 1 つ取り出してウサギを穴に追い込み、他の問題を発見しました。これにより、最終的に、同じことを何度もループしているという問題が見つかりました。これは、行われていることを難読化するマジック ナンバー サイズの配列の使用が少なからず原因でした。最初の「二重変数」の問題を修正することで、この発見 (およびその他の発見) につながりました。

このリファクタリングの旅を同僚と一緒に行ったとき、特定の変更を行った理由と、新しい機能が元の機能と一致していることを確認する方法を彼女が常に理解できていないことが明らかになったので、時間をかけて説明し、証明しました以前のバージョンと比較し、紙の上で変更を段階的に確認することで、各変更を確認します。また、リファクタリングの選択が悪い考えかどうかを判断する方法、コードの変更ではなくコメントを選択する場合、および適切な変数名を選択する方法について、例を挙げて説明しました。

一緒に座ってこれを行うプロセスは、私自身 (他の人に物事を説明する最善の方法についてもう少し学ぶ必要がありました) と同僚 (彼らは私たちのコードとコーディングの実践をより理解するようになりました) の両方にとって価値があると感じました。しかし、この経験から、リファクタリング プロセスを教えるより良い方法はないかと考えるようになりました。

...そして最後に...

リファクタリングが必要なものと不要なもの、およびそれをリファクタリングする方法は非常に主観的なものであることを理解しています。ここでは、似たような経験をし、彼らから何を学んだか (教師または生徒のいずれかとして)。

0 投票する
2 に答える
221 参照

jython - Jython(dom4j)スクリプトをより優雅にするためのサポートが必要です:)

Jythonは優れた言語のように思われるので使い始めましたが、これまでのところ証明されています。

私はdom4jを使用して、ディスク上にある一連のHTMLファイルのDOMからデータを操作および取得しています。以下のスクリプトを記述して、 H1タグのXpathを使用してDOMをスローし、テキストを取得します。H1タグがDOMに存在しない場合は、タイトルタグを検索し、そこからテキストを取得します。

私はJythonを初めて使用しますが、必要なタスクを以下の方法よりもはるかに優雅に実行する方法があると確信しています。これを正しく考えている場合、より良い方法を教えてくれる人はいますか?

誰かが助けることができればそれは素晴らしいでしょう。乾杯

0 投票する
3 に答える
2953 参照

perl - ステートメントを実行せずにPerlスクリプトを使用または要求することは可能ですか?

いくつかの古いスクリプトに単体テストを追加する必要があります。スクリプトはすべて基本的に次の形式です。

単体テストでこのコードを「要求」しようとすると、コードのメインセクションが実行されますが、「foo」を単独でテストできるようにしたいのです。

foo、barを別の.pmファイルに移動せずにこれを行う方法はありますか?

0 投票する
1 に答える
1116 参照

eclipse - Eclipse: プロジェクトからワークスペースへの git リポジトリの再配置

しばらくの間、Eclipse プラグイン プロジェクトに取り組んできましたが、テスト ケースをプラグイン パッケージから分離するためにプロジェクトを分割する必要がある状況に遭遇しました。バージョン管理にはgitを使用しています。

これを簡単に説明すると、古いプロジェクトを次のようにバージョン管理しています。

…そして、私は別のプロジェクトでプラグイン テストを実行する必要がある状況にあります (プラグインに必要なバンドルとして jUnit を必要としないようにするため)。また、ワークスペース内のすべてをバージョン管理するリポジトリが必要です。このような:

古いプロジェクトの履歴を失うことなくこれを行う簡単な方法はありますか?

0 投票する
5 に答える
478 参照

linq - これを素敵な LINQ にリファクタリングできますか?

NavigationTitle、NavigationUrl、および IsCurrent プロパティを持つ単なる軽量クラスである Breadcrumb 型の IList があります。Web サーバーにキャッシュされます。以下のコードを使用して、IsCurrent が true に設定されている最初のパンくずリストまで、現在のパンくずリストを構築するメソッドがあります。それは非常に醜く、間違いなく迅速なダートバッグウィリーソリューションですが、私は興味がありました.これはLINQに簡単にリファクタリングできますか?

0 投票する
3 に答える
4530 参照

sql - SQL Server 2005: ビューによるテーブルのラップ - 長所と短所

バックグラウンド

私は、SQL Server 2005 によってホストされる単一のデータベースと多数のクライアント アプリケーションを備えた従来のスモール ビジネス自動化システム (在庫、販売、調達など) に取り組んでいます。メイン クライアント (すべてのユーザーが使用) は MS Access 2003 アプリケーション (ADP) で、その他のクライアントには、Excel アドインやコマンド ライン ユーティリティなどのさまざまな VB/VBA アプリケーションが含まれます。

60 ほどのテーブル (ほとんどが 3NF) に加えて、データベースには約 200 のビュー、約 170 の UDF (ほとんどがスカラーおよびテーブル値のインラインのもの)、および約 50 のストアド プロシージャが含まれています。ご想像のとおり、いわゆる "ビジネス ロジック" の一部は、この大量の T-SQL コードにカプセル化されています (したがって、すべてのクライアントで共有されます)。

全体として、システムのコード (T-SQL コードを含む) はあまり整理されておらず、いわばリファクタリングに非常に抵抗力があります。特に、ほとんどのテーブルのスキーマは、小規模 (列の名前変更など) から大規模 (正規化など) まで、あらゆる種類のリファクタリングを必要としています。

FWIW、私はかなり長い間まともなアプリケーション開発経験 (C/C++、Java、VB など) を持っていますが、DBA ではありません。したがって、質問がばかげているように見える場合は、なぜそうなのかがわかります。:-)

質問

このすべての混乱をリファクタリングすることを考えているときに (もちろん平和的な方法で)、次のアイデアを思いつきました。

  1. テーブルごとに、(a) テーブルに含まれるすべての列を含む「ラッパー」ビューを作成します。(b) 場合によっては、テーブルの「実際の」列に基づく追加の計算列があります。

    このような追加の計算列の典型的な (単純ではありますが) 例は、製品の通常価格と割引から派生した製品のセール価格です。

  2. 「ラッパー」ビューのみがテーブルを直接参照するように、すべてのコード (T-SQL と VB/VBA クライアント コードの両方) を再編成します。

    したがって、たとえば、アプリケーションまたはストアド プロシージャがテーブルからレコードを挿入/更新/削除する必要がある場合でも、テーブルに対して直接ではなく、対応する「テーブル ラッパー」ビューに対してそれを行います。

したがって、基本的にこれは、ビューによってすべてのテーブルをシステムの残りの部分から分離することです

このアプローチは、特に保守性の観点から、多くの利点を提供するようです。例えば:

  • テーブル列の名前を変更する場合、影響を受けるすべてのクライアント コードを一度に書き直さなくても実行できます。

  • 派生属性を実装する方が簡単です (計算列を使用するよりも簡単です)。

  • 列名のエイリアスを効果的に使用できます。

明らかに、これらすべての利点には何らかの代償が必要ですが、そこにすべてのキャッチが潜んでいるのを見ているかどうかはわかりません.

誰かが実際にこのアプローチを試しましたか? 主な落とし穴は何ですか?

明らかな欠点の 1 つは、「ラッパー」ビューを対応するテーブルと同期して維持するコストです (テーブル内の新しい列もビューに追加する必要があります。テーブルから削除された列はビューからも削除する必要があります。など)。 .)。しかし、この価格は、コードベース全体をより回復力のあるものにするためには小さく、公正であるように思われます.

他の強力な欠点を知っている人はいますか?

たとえば、テーブルの代わりにこれらすべての「ラッパー」ビューを使用すると、パフォーマンスに何らかの悪影響が及ぶ可能性が非常に高くなりますが、この影響は心配するほど大きくなるでしょうか? また、ADODB を使用している場合、いくつかの結合されたテーブルに基づいている場合でも、更新できないレコードセットを取得するのは非常に簡単です。では、「ラッパー」ビューは事態を大幅に悪化させるのでしょうか? などなど…。

コメント(特に共有された実際の経験)は大歓迎です。

ありがとうございました!


PS私は、「ラッパー」ビューのアイデアを議論する次の古い記事を踏んだ:

ビッグビュー神話

この記事では、上記のアプローチを避けるようにアドバイスしています。しかし...この記事では、この考えに反対する正当な理由は見当たりません。まったく逆に、ビューを作成する正当な理由のリストでは、ほぼすべての項目がまさに、すべてのテーブルに対して「ラッパー」ビューを作成することが非常に魅力的である理由です (特にレガシー システムでは、リファクタリング プロセスの一部として) )。

この記事は非常に古い (1999 年) ため、その理由が何であれ、当時は適切であったとしても、現在では適切ではない可能性があります (逆もまた同様です)。最新バージョンの SQL Server と MS Access を使用して、最近このアイデアを検討したり、試したりした人から話を聞くのは非常に興味深いことです...

0 投票する
5 に答える
351 参照

python - ゲームの「ヒットする」値のリファクタリング

私はゲームを作成していますが、方法の 1 つは、スキル値に基づいてキャラクターの基本ヒット数を計算します。各スキルは近距離、中距離、遠距離で使用できるため、この方法では現在、各値を個別に計算しています。

私は当初、スキルを組み合わせてタプルにし、それを繰り返し処理して、各ヒット数を動的に作成できると考えていました。しかし、現在、各ヒット番号を独自の変数に割り当てているため、実際に可能かどうかはわかりません。

また、範囲ごとにメソッドを作成し、タプルを引数として渡すことも考えました。結果の値を使用して新しいタプルまたはリストを作成し、それらを個々の変数に割り当てることもできますが、コピーして貼り付けたように見えないことを除いて、この方法よりも優れているとは思いません.

これが私が現在持っているものです:

これをより動的にするためにどのようにリファクタリングしますか?


編集:私がやりたいことは次のようなものだと思います:タプル(コメントアウトしたものなど)を持ち、それを3回繰り返し、そのたびに(スキルごとに)特定の修飾子に基づいて新しい値を作成します範囲。結果の値は、それぞれの変数に自動的に割り当てられます。

私の頭では、それは理にかなっています。でも、実際にコーディングしようとすると、迷ってしまいます。問題は、これが私が書いた最初の「本物の」プログラムだということです。私が以前に行ったのは小さなスクリプトだけです。

これは私のプログラムの 0.1 バージョンにすぎないので、今すぐリファクタリングする必要はありません。ただし、これを手動で行うのは非常にPythonicではないように思われます。また、将来的に状況が変化した場合に備えて、これを「将来的に保証」したいと考えています。

0 投票する
8 に答える
760 参照

c++ - この C++ コードを改善するにはどうすればよいですか

次の疑似コードについて提案をお願いします。いくつかのデザインパターンを使用できるかどうかにかかわらず、どのように改善できるかを提案してください.

要点を理解していただければ幸いです。問題は、私には多数のid があり、それぞれに独自の操作があることです。また、多くのifelse ifを含む 10 画面のコードがあるのはちょっと見苦しいと思います。