タグ付けされた質問 「code-reuse」

新しいソフトウェアを作成するための既存のコードの使用。

12
プロジェクト間でコードの小さなスニペットを共有するためのベストプラクティス
私は常に仕事で厳密にDRYの原則に従うようにしています。怠inessな状態からコードを繰り返すたびに、後でそのコードを2か所で維持する必要が生じたときに戻ってしまいます。 しかし、多くの場合、互いに参照できない 2つのプロジェクトで再利用する必要がある小さなメソッド(10〜15行のコード)を記述します。この方法は、ネットワーク/文字列/ MVVMなどに関連するものである可能性があり、元々のプロジェクトに固有ではない一般的に有用な方法です。 このコードを再利用する標準的な方法は、再利用可能なコード用に独立したプロジェクトを作成し、必要なときにそのプロジェクトを参照することです。これに伴う問題は、2つの理想的ではないシナリオのいずれかになってしまうことです。 最終的に、数十/数百の小さなプロジェクトになります-それぞれが再利用する必要のある小さなクラス/メソッドを収容します。.DLLほんの少しのコードだけでまったく新しいものを作成する価値はありますか? 関係のないメソッドとクラスのコレクションが増え続ける1つのプロジェクトになります。このアプローチは、私が以前働いていた会社がやったことです。彼らには、base.common前述のようなネットワーク、文字列操作、MVVMなどのフォルダーを持つプロジェクトがありました。それは信じられないほど便利でしたが、不要なすべての無関係なコードを不必要にドラッグして参照しました。 だから私の質問は: ソフトウェアチームは、プロジェクト間で少量のコードを再利用するのに最適な方法を教えてください。 特に、この分野でポリシーを持っている会社で働いている人や、私のように個人的にこのジレンマに直面している人に興味があります。 注:「プロジェクト」、「ソリューション」、および「参照」という言葉の私の使用は、Visual Studioでの.NET開発の背景から来ています。しかし、この問題は言語とプラットフォームに依存しないと確信しています。

11
単体テストでは独自のメソッドを使用すべきではありませんか?
今日、私は「JUnitの基本」ビデオを見ていました。著者は、プログラムで特定のメソッドをテストするとき、プロセスで他のメソッドを使用しないでくださいと言いました。 具体的には、引数に名前と姓を使用するレコード作成メソッドをテストし、それらを使用して特定のテーブルにレコードを作成することについて話していました。しかし、彼は、このメソッドをテストする過程で、他のDAOメソッドを使用してデータベースにクエリを行って最終結果を確認するべきではないと主張しました(レコードが実際に正しいデータで作成されたことを確認するため)。彼は、そのために、データベースを照会して結果を確認するための追加のJDBCコードを作成する必要があると主張しました。 私は彼の主張の精神を理解していると思います:あるメソッドのテストケースが他のメソッド(この場合はDAOメソッド)の正確さに依存することは望ましくなく、これはあなた自身の検証を(再び)書くことによって達成されます/ supportingコード(より具体的で焦点が合っている必要があるため、よりシンプルなコード)。 それにもかかわらず、私の頭の中の声は、コードの重複、不必要な追加作業などの議論で抗議し始めました。他の方法をテストしながら、それらの方法の一部を使用しても大丈夫ですか?それらの1つが想定されていることを実行していない場合、独自のテストケースは失敗します。それを修正し、テストバッテリを再度実行できます。コードの複製(複製コードがいくぶん単純であったとしても)や無駄な努力は必要ありません。 私が書いたいくつかの最近のExcel - VBAアプリケーション(VBA用Rubberduckのおかげで適切にユニットテストされた)のため、私はこれについて強い気持ちがあります。 これについての洞察を共有していただけますか?

9
「クリーンコード」の実践からはほど遠いコードを使用しながら、巨大なオープンソースライブラリをどのように維持しますか。
私はまだ高品質のコードを書くには経験が浅いので、Robert C. MartinによるClean Codeなどの問題に対処する本を読み、よく知られているライブラリのコードをチェックしてスキルを向上させます。 多くのオープンソースライブラリは長年にわたって維持されていますが、正しいパスにないことはほとんどありませんが、それらの多くのコードは、クリーンなコードを記述するための原則からはほど遠いことがわかりました。数百行のコード。 だから私の質問は次のとおりです。きれいなコードの原則はあまりにも制限されていますか?そうでない場合、これらの原則の多くを考慮せずに巨大なライブラリをどのように維持していますか? 簡単な説明をいただければ幸いです。質問が初心者の人からばかげていると思われる場合、私は謝罪します。 編集 Butterknifeライブラリでこの例を確認してください。Androidコミュニティで最もよく知られているライブラリの1つです。

19
OOPはコードの再利用という約束を果たしていますか?コードの再利用を実現するための代替手段はありますか?
おそらく、オブジェクト指向のパラダイムを使用する最大の約束は、コードの再利用です。これが達成されたという論争もある。なぜ達成されたのか(達成されなかったのか)? OOPが定義するとおりにコードを再利用し、プロジェクトの生産性を高めますか? それとも管理しやすいですか?または保守が簡単ですか?または、より品質が高いですか? おそらく、コードの再利用は良いことですが、この目標を達成する方法はいくつかあります。問題は、OOPが提供するコード再利用の方法です。良かった?オブジェクト指向、サブクラス化、ポリモーフィズムなどよりも優れたコード再利用を実現する方法はありますか?より良い方法は何ですか?なんで? OOPの再利用や他のパラダイムの再利用の経験を教えてください。

8
クラスを「オープン」に設計するべきではないのはなぜですか?
さまざまなStack Overflowの質問や他の人のコードを読むとき、クラスを設計する方法の一般的なコンセンサスは閉じられています。これは、JavaおよびC#のデフォルトでは、すべてがプライベートであり、フィールドがfinalであり、一部のメソッドがfinalであり、クラスがfinalでさえあることを意味します。 この背後にある考え方は、実装の詳細を隠すことです。これは非常に良い理由です。ただしprotected、ほとんどのOOP言語とポリモーフィズムの存在により、これは機能しません。 クラスに機能を追加したり変更したりするたびに、私は通常、あらゆる場所に配置されたプライベートおよびファイナルによって妨げられています。ここでは、実装の詳細が重要です。実装を取得して拡張し、結果が何であるかを十分に理解しています。ただし、プライベートおよび最終的なフィールドとメソッドにアクセスできないため、3つのオプションがあります。 クラスを拡張せず、より複雑なコードにつながる問題を回避してください クラス全体をコピーして貼り付け、コードの再利用性を損なう プロジェクトを分岐する これらは良い選択肢ではありません。なぜprotectedそれをサポートする言語で書かれたプロジェクトで使用されないのですか?一部のプロジェクトがクラスからの継承を明示的に禁止しているのはなぜですか?
44 code-reuse 

7
チームが作成したクラスと機能をどのように追跡しますか?
コードで作業するとき、チームメートと同じ課題の多くに直面します。また、有用な関数とクラスをいくつか作成しました。良好なコミュニケーションがあれば、誰かがまとめた素晴らしいことを聞くことができます。6か月後に必要になったときにそれを覚えて、その関数を呼び出して時間を節約できます。覚えていない場合、またはまったく知らない場合は、おそらく車輪を再発明します。 これらの種類のものを文書化する特定の慣行はありますか?どのようにしてそれらを見つけやすくしますか? チームにそのようなドキュメントがない場合、ホイールがすでに存在するかどうかをどのように確認しますか? 編集: これまでのところ、答えの1つを除くすべてが理想的な状況を扱っているので、これらのソリューションを要約します。ドキュメントとコミュニケーション。wiki、スタンドアップミーティングなどはすべて素晴らしいものですが、ドキュメントを作成し、ミーティングに参加し、メモを取り、すべてを覚える時間(およびスキル)を持つプログラマーに依存しています。 これまでで最も人気のある回答(Calebの回答)は、文書化や会議ができないプログラマーが使用できる唯一の回答であり、プログラミングを1つだけ行います。プログラミングはプログラマーが行うことであり、もちろん、優れたプログラマーはドキュメント、ユニットテストなどを作成できますが、それに直面しましょう-私たちのほとんどはプログラミングよりもドキュメントを好みます。彼の解決策は、プログラマが再利用可能なコードを認識し、それを独自のクラスまたはリポジトリなどに引き出し、それが分離されているという事実によって、それが見つけやすくなり、それを使用するための学習曲線を容易にすることです... 。そして、これはプログラミングによって達成されました。 ある意味では、このように見えます。3つの関数を書いたばかりで、他の誰かがそれらについて知っておく必要があると思います。私はそれらを文書化し、書き、会議で発表することができます-私はできますが、それは私の強さではありません-または....私はそれらをクラスに抽出し、それをうまく命名し、それらをブラックボックス、および他のクラスファイルが行く場所に貼り付けます。その後、それを発表する短いメールは簡単です。他の開発者はコードをスキャンして、完全に理解していないコードで使用されている分離された関数よりもよく理解できます。そのコンテキストは削除されます。 これは、適切な名前のメソッドを備えた適切な名前のクラスファイルのセットを持つことは、優れたプログラミングによって達成される優れたソリューションであることを意味するため、これが気に入っています。会議を必要とせず、詳細な文書の必要性を和らげます。 この流れに他にもアイデアはありますか?

16
ライブラリとコードスニペットを多用しない具体的な理由はありますか?[閉まっている]
全体的に私は約8年間プログラミングに携わっており、「仕事をやり遂げる」ためにオープンソースライブラリとスニペット(GitHubを気にせず)にますます依存しているように思えます。やがて自分の実装を書くことができることは知っていますが、全体的な設計に集中したいです。 これは正常ですか(非企業環境)?私の「プログラミング」が異なるライブラリーを一緒に接着すること以外の何物でもない場合、何がうまくいかないのでしょうか? 「車輪を再発明しない」ことは知っていますが、もう1つの車輪を発明しないとどうなりますか?

4
Rich Hickeyは、「[インターフェイス/クラス/タイプ]のすべての特異性があなたの再利用を殺します!」と言ったとき、何を意味しましたか?
Rich Hickeyの思考を刺激するgoto会議の基調講演「価値の価値」で29分間、彼はJavaのような言語のオーバーヘッドについて話し、「これらのインターフェースはすべて再利用を殺します」のような声明を出します。彼はどういう意味ですか?本当? 私は答えを探して、次のことを見つけました。 最小知識の原則別名、気密APIインターフェイスを奨励するデメテルの法則。ウィキペディアには、いくつかの欠点もリストされています。 再利用ではなく、その使用が適切な目標であると主張するケヴリン・ヘニーのインペリアル衣料危機。 ジャック・ディーデリッヒの「クラスを書くのをやめなさい」は、一般的なオーバーエンジニアリングに反対する議論をしています。 明らかに、不適切に書かれたものは何も役に立たないでしょう。しかし、適切に作成されたAPIのインターフェースは、そのコードの使用をどのように防ぐのでしょうか?1つの目的のために作られたものが他のものにより多く使用されている歴史の中に例があります。しかし、ソフトウェアの世界では、意図していない目的で何かを使用すると、通常は壊れます。 私は、いくつかのコードの正当であるが意図しない使用を防ぐ良いインターフェースの良い例を探しています。それは存在しますか?想像できません。

9
コーディング時に解析によって麻痺を克服するにはどうすればよいですか?
新しいプロジェクトを始めるとき、私はしばしばすぐに実装の詳細について考え始めます。「DataBaseHandlerはどこに配置しますか。どのように使用する必要がありますか?それを使用するクラスはいくつかの抽象スーパークラスから拡張する必要があります..?インターフェイスを使用する必要がありますか?を含むクラスで使用する抽象化のレベルリクエストを送信してデータを解析する方法は?」 拡張性と再利用性のためにコーディングしたいので、私は長い間行き詰まってしまいます。しかし、完全に実装する方法について過去の考えを得るのはほとんど不可能だと感じています。 そして、「ネジを締めて、やるだけだ!」と言うと、コードが整理されていないため、抽象化のレベルが混在しているなどの理由で、レンガの壁にすばやくぶつかります。 新しいプロジェクトを立ち上げながら、拡張性の高い論理/モジュール構造をセットアップするためのテクニック/方法は何ですか? - - EDIT - - まあ、これはすでに答えを受け入れるのが難しいタイプの質問ですが、いくつかのコンセンサスがあるかどうかを確認して、より多くのフィードバックを取得したいです。TDDは本当にクールに聞こえますが、率直に言って、JUnitなどの使用方法をもっと理解することを意味してきました。同時に、TDDのファンは、TDDに関連する1つの正当な点が特定の問題は、TDDが実際に設計の問題に対処していないように見えることです。確かに、TDDは自分がやりたいことを定義するのに役立ち、徐々にその方法を進めることができますが、ユニットテストをすべて通過できるさまざまな全体的なデザインパターン/構造があります。それだけです:単一のUNITSをテストします。私は少し混乱していると思います...私は知らない。多分、私' ありがとう!

5
ソフトウェアの成功/失敗率の書き換えに関する実際のケーススタディはありますか?
私は、アプリケーションの書き直しが悪いことについての複数の投稿、プログラマに関するここでの人々の経験、およびこのテーマに関するJoel Spolskyによる準備ができた記事を見ましたが、確固たる証拠や事例研究はありません。Joelが提供した2つの例とここの他の投稿以外に、悪いコードベースで何をし、実際の研究に基づいてどのようにそれを行うかを決定しますか? 適切な例として、私が知っているクライアントは2つあり、どちらも古いレガシーコードを持っています。彼らは、書き直しが惨事であり、費用がかかり、コードを大幅に改善することが実際にはできなかったため、彼らはそれに合わせてリンプを続けています。リライタがすぐに見つけたように、その顧客は非常に複雑なビジネスロジックを持っています。 どちらの場合も、これらは企業にとって多くの収益をもたらすミッションクリティカルなアプリケーションです。書き直そうとした人は、将来のある時点でレガシーソフトウェアがアップグレードされなければ、レンガの壁にぶつかると感じていました。私にとって、この種のリスクは、成功する道を確保するための研究と分析を必要とします。 これを調査した実際のケーススタディはありますか?実際の研究に基づいたいくつかのベストプラクティス、落とし穴、成功を知らずに、大規模な書き直しを試みたくありません。 あとがき: さて、さらに検索した結果、ケーススタディに関する3つの興味深い記事が見つかりました。 書き換えまたは再利用。彼らはJavaに変換されたCobolアプリの研究を行いました。 もう1つは、ソフトウェアの再利用:開発者の経験と認識に関するものでした。 再利用または書き換えメンテナンスと書き換えのコストに関する別の研究。 最近、このテーマに関する別の記事を見つけました:The Great Rewrite。そこで、著者は主要な問題のいくつかにぶつかったようです。これに加えて、提案された新しいテクノロジースタックを使用し、開発者がそれを拾った速さを測定することによるプロトタイピングのアイデアがありました。これはすべて書き直しの前奏曲であり、素晴らしいアイデアだと思いました!

16
独自の「その他のユーティリティ」ライブラリはありますか?あなたが最も誇りに思う部分は何ですか?[閉まっている]
私たちの多くは、頻繁に使用するツールとユーティリティを使用して、独自の小さな個人ライブラリを維持していることを知っています。 私は16歳の時から私のものを持っているので、かなりの規模に成長しました。私が書いたもののいくつかは、その後フレームワークに追加されました。LINQのかなり前に、遺伝的アルゴリズムで使用する式ツリーの独自の小さな実装を作成しました。しかし最近、私はそれを経験して.NET 4.0にアップグレードし、興味を再燃させました。 だから私はあなたがあなたのライブラリを何のために使うのか興味があります。たぶん、便利な小さなスニペットのためにいくつかのクールなアイデアを得て、それらを私たちの間で共有することができました。 だから私の質問は: その他のユーティリティライブラリはありますか? あなたが最も誇りに思っている部分とその理由は? 必要に応じてコードの例を挙げてください :-)

12
職場で作成したコードを個人的なプロジェクトに再利用するのは間違っていますか?
さまざまな職場で、「これは他の状況で本当に役立つだろう」と考えさせるコードを常に書きました。実際、コードを書くのに時間がかかっても、意図的にコードを作成します。これは、将来的に役立つことがわかっています(カスタムSubString()関数など)。これらのスニペットの適切な候補は、さまざまな「ヘルパー」クラスです。 これらのスニペットは、おそらくオンラインの他の場所で見つけることができると確信していますが、ポイントは、私がそれらを書いて、後で他の仕事や個人的なプロジェクトで再び使用することです。現在、私は個人的なコードライブラリを維持しませんが、問題がある、それはあなたがそれを仕事で生産し、再使用しているコード(取ることが間違っている個人的なプロジェクトのために)、および(B他のジョブで)?

7
ソフトウェアの再利用はプロセスの再現性を妨げますか
問題としてのコードの再利用 私が考えていたこの質問ソフトウェア・デリバリーに、私は問題に戻って来るまま再現性および/または再現。プロジェクトを繰り返さないと、プロジェクトのビルドに使用したプロセスを改善することが難しくなるためです。エンジニアリングでは、高品質のプロジェクトを作成するために、設計と建設に関連するプロセスを絶えず改善する必要があります。 ソフトウェアは、そのデジタル形式のために再利用に大きく依存できます。モジュールを書き換える代わりに、もう一度呼び出すか、他のシステムにコピーします。いくつかの例は、認証/ログインまたはおそらくロギング機能です。これらのカテゴリには多くのよく知られた例があります。そして、従来の知恵は、あなた自身のものを転がす代わりに存在するものを再利用することです。 他の分野とのいくつかの比較 建設 対照的に、物理システム(建物、橋)の建設は、再利用できるほど近くはありません。家の設計図を何度も再利用して同じ家のコピーを作成できることは事実ですが、そのたびに建設を実行する必要があります。アナログの世界では、カットアンドペーストはそのようには機能しません。橋の設計図は、サイトの条件が異なるため、住宅よりも再利用性が低くなります。 マスタービルダーは、その地域で数十、数百、または数千のものを設計および/または構築したことで知られる専門家です。たとえば、世界的に有名な建築家およびデザイナーであるフランク・ロイド・ライトdesigned more than 1,000 structures and completed 532 works。「ちょうど」5つの言語(Turbo Pascal、Delphi、J ++、C#、Typescript)を設計したAnders Hejlsbergとは対照的です。ドメインが異なるため、多くの点で不公平な比較です。しかし、大まかに言って、2人の非常に知的な人からの定量化可能な作品は大きく異なります。 武道 武道家は、動きの習得は数千の繰り返しからのみ来ると言うでしょう。これらの繰り返しのかなりの部分が投入された後、多くの武道家は、以前は複雑な型または形であると認識されていたことが単純になったことに驚いています。それらの学生のインストラクターは、動きがより流動的で意図的であり、動きが経済的であることにも気付くでしょう。同様に、経験豊富な武道家は、経験の少ない学生よりも複雑なカタをより速く拾うことができます。繰り返しの経験から、より迅速に学習できるフレームワークまたはプロセスが得られました。 木工 木工労働者も同様の変化を経験します。趣味の木材職人は、多くの引き出しを必要とする最初のプロジェクトを常に参照しています。彼らがプロジェクトを完了すると、彼らは組立ラインが生み出す効率性に新たな評価を得ることができます。木材を最大限に活用するために、シートストックに引き出し部品をレイアウトする方法をよりよく理解するなど、他の利点もあります。愛好家と比較して、プロの木材労働者は、以前に何度も作ったアイテムをより迅速に設計、開始、および構築することができます。彼らはまた、他の誰かの設計に内在する問題を自分の仕事でその間違いを犯したことを見る能力を得ます。 それで、ソフトウェアの再利用はソフトウェア開発者がより熟練するのを妨げますか? 多くの点で、ソフトウェアの設計と構築は常に新しいものです。モジュール、ライブラリ、またはシステムを再利用できる場合は、再利用できるため、過去の作業を繰り返すことはありません。ゼロから全体を書き換える前に、既存のシステムを優先的に拡張します。しかし、繰り返しにより、設計と構造の効率を見つけることができます。スポーツや身体活動を実践したことがある人なら誰でも、繰り返しが良い開業医になるための鍵であることを教えてくれます。 私の質問:ソフトウェアの再利用能力は、プロジェクトを繰り返すことから生じる必要なプロセスの改善と効率を妨げますか?

9
複雑さを追加して重複コードを削除する
私はすべてが一般的な基本クラスから継承するいくつかのクラスを持っています。基本クラスには、typeのいくつかのオブジェクトのコレクションが含まれますT。 各子クラスは、オブジェクトのコレクションから補間値を計算できる必要がありますが、子クラスは異なるタイプを使用するため、計算はクラスごとにわずかに異なります。 これまで、コードをクラスからクラスにコピー/ペーストし、それぞれに小さな変更を加えました。しかし、今は重複したコードを削除し、基本クラスの1つの汎用補間メソッドに置き換えようとしています。しかし、それは非常に困難であることが証明されており、私が考えているすべての解決策は非常に複雑に思えます。 DRYの原則はこのような状況にはあまり当てはまらないと思い始めていますが、それは冒aspのように聞こえます。コードの重複を削除しようとすると、どれだけ複雑になりますか? 編集: 私が思いつく最良の解決策は次のようなものです: 基本クラス: protected T GetInterpolated(int frame) { var index = SortedFrames.BinarySearch(frame); if (index >= 0) return Data[index]; index = ~index; if (index == 0) return Data[index]; if (index >= Data.Count) return Data[Data.Count - 1]; return GetInterpolatedItem(frame, Data[index - 1], Data[index]); } protected abstract T GetInterpolatedItem(int …

6
他の顧客のプロジェクトでコードを再利用することは合法ですか?
私は、モバイルアプリケーションの独立したソフトウェア開発者として働いています。顧客からモバイルアプリの開発を依頼されました。そのため、現時点では、このプロジェクトのオファーを作成する時間と労力を計算しています。 アプリ自体は、それ以降は特定のイベントに関連するため、役に立たない場合は特定の時間だけ使用されます。ただし、アプリの基本機能は、イベントに同様のアプリを使用したい他の顧客にとって再利用可能になります。 現時点では、顧客のためにアプリを開発してもいいのかと思っていますが、開発にお金を払って、別の顧客のアプリのソースコードの一部を再利用してもらえますか? それでは、このシナリオに対処する最良の方法は何でしょうか? アプリのソースコードは誰のものですか? 開発費用を支払ったときに、ソースコードを顧客に提供する必要がありますか? 必要に応じて、コピーを保持して後で再利用できますか? コードを再利用するよう顧客に依頼する必要がありますか? ここで何らかのライセンスモデルを使用する必要がありますか。そして、最初の顧客に開発の特定の部分だけを支払わせるので、心配なくコードを再利用できますか? 自分の状況を明確にしたいと思います。お返事をお待ちしております。
22 legal  code-reuse 

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