サードパーティのライブラリを使用する-常にラッパーを使用しますか?


78

私が携わっているほとんどのプロジェクトは、いくつかのオープンソースコンポーネントを使用しています。一般的な原則として、コードのすべてのコンポーネントをサードパーティのライブラリにバインドするのを常に避け、代わりにカプセル化ラッパーを経由して変更の痛みを避けるのは良い考えですか?

例として、ほとんどのPHPプロジェクトはlog4phpをロギングフレームワークとして直接使用します。つまり、\ Logger :: getLogger()を介してインスタンス化し、-> info()または-> warn()メソッドなどを使用します。ただし、何らかの点で優れた仮想ロギングフレームワークが表示される場合があります。現状では、log4phpメソッドシグネチャに密接に関連するすべてのプロジェクトは、新しいシグネチャに適合するために、数十箇所で変更する必要があります。これは明らかにコードベースに大きな影響を与え、変更は潜在的な問題です。

この種のシナリオから将来の新しいコードベースを保証するために、ロギング機能をカプセル化し、最小限の変更で将来のロギングの動作方法を変更するために、ロギング機能をカプセル化し、簡単にできるようにするラッパークラスをしばしば検討します(そして時々実装します) ; コードがラッパーを呼び出すと、ラッパーは呼び出しをロギングフレームワークdu jourに渡します。

他のライブラリにはもっと複雑な例があることを念頭に置いて、私は過剰に設計しているのですか、それともほとんどの場合賢明な予防策ですか?

編集:その他の考慮事項-依存性注入とテストダブルを使用するには、とにかくほとんどのAPIを抽象化する必要があります(「コードの実行を確認し、その状態を更新しますが、ログコメントの書き込み/実際のデータベースへのアクセスはしません」)。これは決定者ではありませんか?


3
log4XYZはそのような強力な商標です。そのAPIは、リンクリストのAPIが変更されるときよりも早く変更されません。両方とも今では長い間解決された問題です。
ジョブ

1
このSO質問の正確な複製:stackoverflow.com/questions/1916030/...
マイケルBorgwardt

1
内部で使用しているだけの場合、ラップするかどうかは、現在の既知の作業と後で実行できる作業とのトレードオフにすぎません。判断の呼び出し。しかし、他のレスポンダーが話を怠ったように見えるのは、それがAPI依存関係なのか実装依存関係なのかです。つまり、このサードパーティAPIから独自のパブリックAPIを介してクラスをリークし、ユーザーに公開していますか? この場合、別のライブラリに移動することはもはや簡単なことではありません。問題は、独自のAPIを壊すことなく不可能になったことです。これは非常に悪いです!
エリアスヴァシレンコ

1
さらなる参照:このパターンは、外部インフラストラクチャ(外部ライブラリと呼びます)がインターフェイスの背後に隠れているonion-architectureと呼ばれます
k3b

回答:


42

サードパーティAPIの小さなサブセットのみを使用する場合は、ラッパーを作成するのが理にかなっています。これは、カプセル化と情報の隠蔽に役立ち、巨大なAPIを独自のコードに公開しないようにします。また、使用したくない機能を「非表示」にすることもできます。

ラッパーのもう1つの正当な理由は、サードパーティのライブラリを変更する予定がある場合です。これがインフラストラクチャの一部であり、変更しないことがわかっている場合は、ラッパーを作成しないでください。


良い点ですが、よく理解されている多くの理由(テストが難しい、リファクタリングが難しいなど)のため、密接に結合されたコードは悪いと教えられています。質問の別の言い回しは、「結合が悪い場合、なぜAPIに結合してもよいのですか?」です。
lotsoffreetime

7
@lotsoffreetime APIへの結合を避けることはできません。したがって、独自のAPIに結合することをお勧めします。そうすれば、ライブラリを変更でき、通常はラッパーが提供するAPIを変更する必要はありません。
ジョージマリアン

@ george-marian 特定のAPIの使用を避けられない場合、タッチポイントを最小限に抑えることができます。質問は、私はこれを常にやろうとしているのか、それともやり過ぎなのか?
lotsoffreetime

2
@lotsoffreetimeそれは答えるのが難しい質問です。私はその目的に対する答えを拡大しました。(基本的に、それは多くのifsにあります。)
ジョージマリアン

2
@lotsoffreetime:空き時間がたくさんある場合は、どちらでもできます。ただし、次の条件を除き、APIラッパーを作成しないことをお勧めします。1)元のAPIは非常に低レベルであるため、特定のプロジェクトのニーズに合わせて高レベルのAPIを作成するか、2)近い将来、ライブラリを切り替えるには、現在のライブラリを、より良いライブラリを探すための足がかりとしてのみ使用しています。
ライライアン

28

この申し立てられた将来の改良されたロガーがどんな素晴らしい素晴らしい新機能を持っているか知らずに、あなたはどのようにラッパーを書きますか?最も論理的な選択は、ラッパーに何らかのロガークラスをインスタンス化し、->info()またはなどのメソッドを持たせること->warn()です。言い換えれば、現在のAPIと本質的に同一です。

私は決して変更する必要がないかもしれない、またはとにかくやむを得ない書き換えを必要とするかもしれない将来性のあるコードではなく、「過去の証明」コードを好む。それは私が大幅にコンポーネントを変更できますまれに、あることだ、私は過去のコードと互換性を持たせるためのラッパーを書くとき。ただし、新しいコードは新しいAPIを使用します。とにかく同じファイルに変更を加えるとき、またはスケジュールが許す限り、古いコードをリファクタリングして使用します。数か月後、ラッパーを削除できます。変更は段階的で堅牢です。

別の言い方をすれば、ラッパーは、ラップする必要があるすべてのAPIを既に知っている場合にのみ意味を持ちます。良い例は、アプリケーションが現在、多くの異なるデータベースドライバー、オペレーティングシステム、またはPHPバージョンをサポートする必要がある場合です。


「...ラッパーは、ラップする必要があるすべてのAPIを既に知っている場合にのみ意味をなします。」これは、ラッパーでAPIを照合する場合に当てはまります。おそらく、ラッパーよりも「カプセル化」という用語を強く使用する必要があります。これらのAPI呼び出しを抽象化して、「このパラメーターでfoo :: log()を呼び出す」のではなく、「何らかの方法でこのテキストを記録する」ようにします。
lotsoffreetime

「この改善された将来のロガーと思われる超新機能がどんなものか知らずに、ラッパーをどのように書きますか?」以下の@ kevin-clineは、新しい機能ではなく、パフォーマンスが向上した将来のロガーに言及しています。この場合、ラップする新しいAPIはなく、異なるファクトリメソッドです。
lotsoffreetime

27

サードパーティのライブラリをラップすることにより、その上に抽象化のレイヤーを追加します。これにはいくつかの利点があります。

  • コードベースは変更に対してより柔軟になります

    ライブラリを別のライブラリに置き換える必要がある場合は、ラッパーの実装を1か所で変更するだけです。ラッパーの実装を変更できます。他のことを変更する必要はありません。つまり、疎結合システムを使用しています。それ以外の場合は、コードベース全体を調べて、どこでも変更を行う必要があります。これは明らかに必要なものではありません。

  • ライブラリのAPIとは別にラッパーのAPIを定義できます

    異なるライブラリは、非常に異なるAPIを持つことができますが、同時に、それらのどれもあなたが必要とするものではないかもしれません。一部のライブラリで、すべての呼び出しとともにトークンを渡す必要がある場合はどうなりますか?ライブラリを使用する必要がある場所ならどこでもトークンをアプリ内で渡すことができます。または、より中央のどこかに安全に保管できますが、いずれにしてもトークンが必要です。ラッパークラスにより、この全体が再び単純になります。トークンをラッパークラス内に保持するだけで、アプリ内のコンポーネントにトークンを公開せずに、その必要性を完全に抽象化できるためです。優れたAPIデザインを強調していないライブラリを使用したことがある場合、大きな利点があります。

  • 単体テストはずっと簡単です

    単体テストは1つのことのみをテストする必要があります。クラスを単体テストする場合は、その依存関係を模擬する必要があります。そのクラスがネットワーク呼び出しを行うか、ソフトウェアの外部の他のリソースにアクセスする場合、これはさらに重要になります。サードパーティのライブラリをラップすることにより、これらの呼び出しをモックし、テストデータまたは単体テストに必要なものを簡単に返すことができます。このような抽象化レイヤーがない場合、これを行うのははるかに困難になります。ほとんどの場合、これは多くのlotいコードになります。

  • 疎結合システムを作成します

    ラッパーの変更は、少なくともラッパーの動作を変更しない限り、ソフトウェアの他の部分には影響しません。このラッパーのような抽象化レイヤーを導入することにより、ライブラリーへの呼び出しを簡素化し、そのライブラリーへのアプリの依存関係をほぼ完全に削除できます。あなたのソフトウェアはラッパーを使用するだけで、ラッパーの実装方法や実行方法に違いはありません。


実用例

正直になりましょう。人々はこのようなものの長所と短所について何時間も議論することができます-それが私がむしろあなたに例を示している理由です。

ある種のAndroidアプリがあり、画像をダウンロードする必要があるとします。PicassoUniversal Image Loaderなど、画像の読み込みとキャッシュを簡単にするライブラリがたくさんあります。

これで、使用するライブラリをラップするために使用するインターフェイスを定義できます。

public interface ImageService {
    Bitmap load(String url);
}

これは、画像を読み込む必要があるときにアプリ全体で使用できるインターフェイスです。このインターフェイスの実装を作成し、依存関係の注入を使用して、を使用するすべての場所にその実装のインスタンスを注入できますImageService

最初にピカソを使用することにしたとしましょう。ImageServiceこれで、Picassoを内部で使用する実装を作成できます。

public class PicassoImageService implements ImageService {

    private final Context mContext;

    public PicassoImageService(Context context) {
        mContext = context;
    }

    @Override
    public Bitmap load(String url) {
        return Picasso.with(mContext).load(url).get();
    }
}

あなたが私に尋ねると、かなり簡単です。ライブラリを包むラッパーは、便利にするために複雑にする必要はありません。インターフェイスと実装のコードの合計行数は25未満であるため、これを作成することはほとんどありませんでしたが、すでにこれを行うことで何かを得ています。Context実装のフィールドを参照してください?選択した依存性注入フレームワークは、を使用する前にその依存性の注入をすでに処理しているためImageService、アプリは画像のダウンロード方法やライブラリが持つ依存性を気にする必要がなくなりました。アプリにImageService表示されるのはload()であり、URLを使用して呼び出す画像が必要な場合-シンプルで簡単です。

しかし、物事を変え始めると、本当のメリットが得られます。Picassoは現在必要な機能をサポートしていないため、PicassoをUniversal Image Loaderに置き換える必要があると想像してください。コードベースをくまなく調べて、ピカソへのすべての呼び出しを退屈に置き換え、ピカソへの呼び出しをいくつか忘れていたため、数十のコンパイルエラーに対処する必要がありますか?いいえ。必要なのは、新しい実装を作成し、ImageService依存性注入フレームワークに今後この実装を使用するように指示することだけです。

public class UniversalImageLoaderImageService implements ImageService {

    private final ImageLoader mImageLoader;

    public UniversalImageLoaderImageService(Context context) {

        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .defaultDisplayImageOptions(defaultOptions)
                .build();

        mImageLoader = ImageLoader.getInstance();
        mImageLoader.init(config);
    }

    @Override
    public Bitmap load(String url) {
        return mImageLoader.loadImageSync(url);
    }
}

ご覧のとおり、実装は大きく異なる可能性がありますが、重要ではありません。アプリの他の場所でコードを1行も変更する必要はありませんでした。完全に異なる機能を持つか、まったく異なる方法で使用される可能性のある完全に異なるライブラリを使用しますが、アプリは気にしません。アプリの残りの部分がImageServiceそのload()メソッドを備えたインターフェイスを見るだけで、このメソッドが実装されることは重要ではありません。

少なくとも私にとっては、これはすでにかなりいい音に聞こえますが、待ってください!まだまだあります。作業中のクラスの単体テストを作成しており、このクラスがを使用しているとしImageServiceます。もちろん、単体テストで他のサーバーにあるリソースへのネットワーク呼び出しを行うことはできませんが、現在使用しているので、模擬テストを実装するImageServiceことで簡単に単体テストに使用されるload()静的を返すことができます:BitmapImageService

public class MockImageService implements ImageService {

    private final Bitmap mMockBitmap;

    public MockImageService(Bitmap mockBitmap) {
        mMockBitmap = mockBitmap;
    }

    @Override
    public Bitmap load(String url) {
        return mMockBitmap;
    }
}

サードパーティのライブラリをラップすることで要約すると、コードベースは変更に対してより柔軟になり、全体的にシンプルで、テストが容易になり、ソフトウェア内のさまざまなコンポーネントの結合を減らします-ソフトウェアを長期間維持するほどますます重要になるすべてのもの。


1
これは、不安定なAPIにも当てはまります。基礎となるライブラリが変更されたからといって、コードが1000箇所で変更されることはありません。とてもいい答えです。
ラバーダック

非常に簡潔で明確な答え。ウェブ上でフロントエンドの仕事をしています。その風景の変化の量は非常識です。人々が自分の意志が変化しないと「考える」という事実は、変化がないという意味ではありません。YAGNIの言及を見ました。新しい頭字語、YDKYAGNIを追加したいと思います。特にWeb関連の実装で。原則として、小さなAPI(select2など)のみを公開するライブラリをラップします。大きなライブラリはアーキテクチャに影響を与え、それらをラップすることは、アーキテクチャの変更を期待していることを意味しますが、変更する可能性は低くなります。
バイバイ

あなたの答えは非常に役に立ち、概念を例とともに提示することで概念がさらに明確になりました。
アニルゴーシー

24

明日何か良いことが起こった場合に、今日サードパーティのライブラリをラッピングすることは、YAGNIの非常に無駄な違反だと思います。アプリケーション固有の方法でサードパーティのコードを繰り返し呼び出す場合は、繰り返しを排除するために、これらの呼び出しをラッピングクラスにリファクタリングする必要があります。それ以外の場合は、ライブラリAPIを完全に使用しており、ラッパーはライブラリ自体のように見えます。

ここで、優れたパフォーマンスなどを備えた新しいライブラリが登場するとします。最初のケースでは、新しいAPIのラッパーを書き換えるだけです。問題ない。

2番目のケースでは、新しいライブラリを駆動するために古いインターフェイスを適応させるラッパーを作成します。もう少し作業はありますが、問題はありません。ラッパーを以前に作成した場合と同じように作業できます。


4
YAGNIは必ずしもこの状況に当てはまるとは思いません。将来必要になる可能性がある場合に備えて、機能を組み込むことではありません。アーキテクチャに柔軟性を組み込むことです。その柔軟性が不要な場合、はい、YAGNIが適用されます。ただし、その決定は、変更を行うのが苦痛になる可能性が高いときに将来的に行われる傾向があります。
ジョージマリアン

7
@George Marian:問題は95%の時間であり、変更するための柔軟性は必要ありません。優れたパフォーマンスを備えた将来の新しいライブラリに切り替える必要がある場合は、必要に応じて呼び出しを検索/置換したり、ラッパーを作成したりするのはかなり簡単です。一方、新しいライブラリにさまざまな機能が搭載されている場合、古いコードを移植して新しい機能を活用することとラッパーを維持するという2つの問題があるため、ラッパーは障害になります。
ライライアン

3
@lotsoffreetime:「優れた設計」の目的は、アプリケーションの耐用期間中の総コストを最小化することです。予想される将来の変更に間接化のレイヤーを追加すると、非常に高価な保険になります。私は誰もそのアプローチから節約を実現するのを見たことがありません。それは、顧客固有の要件により多くの時間を費やすプログラマにとって、些細な作業を作成するだけです。ほとんどの場合、顧客に固有ではないコードを書いている場合、時間とお金を無駄にしています。
ケビンクライン

1
@George:これらの変更が痛みを伴う場合、それはプロセスの匂いだと思います。Javaでは、古いクラスと同じ名前で新しいクラスを作成しますが、異なるパッケージで、古いパッケージ名のすべての出現箇所を変更し、自動テストを再実行します。
ケビンクライン

1
@kevinラッパーを更新してテストを実行するよりも、作業が多く、したがってリスクが伴います。
ジョージマリアン

9

サードパーティライブラリのラッパーを記述する基本的な理由は、サードパーティライブラリを使用するコードを変更せずにそのサードパーティライブラリを交換できるようにするためです。何かへのカップリングを避けることはできないので、あなたが書いたAPIにカップリングする方が良いという議論があります。

これが努力に値するかどうかは別の話です。その議論は長い間続くでしょう。

このような変更が必要になる可能性が低い小規模プロジェクトでは、おそらく不必要な努力です。大規模なプロジェクトの場合、その柔軟性は、ライブラリをラップするための余分な労力をはるかに上回る場合があります。しかし、事前にそうであるかどうかを知ることは困難です。

別の見方をすれば、変更される可能性のあるものを抽象化するという基本原則です。そのため、サードパーティのライブラリが十分に確立されており、変更される可能性が低い場合、それをラップしないことは問題ありません。ただし、サードパーティのライブラリが比較的新しい場合は、交換が必要になる可能性が高くなります。とはいえ、確立されたライブラリの開発は何度も放棄されてきました。したがって、これは簡単に答えられる質問ではありません。


APIのモックを注入できることでテスト対象のユニットを最小化できるユニットテストの場合、「潜在的な変更」は要因ではありません。そうは言っても、これは私の考えに最も近いので、今でも私のお気に入りの答えです。ボブおじさんは何と言いますか?:)
lotsoffreetime

また、小さなプロジェクト(チーム、基本仕様など)には独自のルールがあり、ある程度の範囲でこのような優れたプラクティスに違反し、それを回避できます。しかし、それは...別の質問です
lotsoffreetime

1

@Odedが既に言ったことに加えて、ロギングの特別な目的のためにこの回答を追加したいと思います。


ロギング用のインターフェイスは常にありますが、log4fooフレームワークを置き換える必要はありませんでした。

インターフェースを提供してラッパーを作成するのに30分しかかからないので、不必要であることが判明したとしても、あまり時間を無駄にしないと思います。

YAGNIの特別なケースです。必要はありませんが、それほど時間はかからず、より安全だと感じています。ロガーを交換する日が本当に来たら、実世界のプロジェクトで電話を交換するのに1日以上かかるので、30分も投資できてうれしいです。また、ログ記録の単体テスト(ロガー実装自体のテストは別として)を書いたり見たりしたことはないので、ラッパーなしの欠陥を期待してください。


log4fooを変更する予定はありませんが、広く知られており、例として役立ちます。また、これまでの2つの答えがどのように補完的であるかが興味深いことです。「常にラップしないでください」。「念のためにラップ」。
lotsoffreetime

@Falcon:すべてを包みますか?ORM、ログインターフェイス、コア言語クラス?結局のところ、いつより良いHashMapが必要になるかはわかりません。
ケビンクライン

1

私は現在取り組んでいるプロジェクトでこの正確な問題を扱っています。しかし、私の場合、ライブラリはグラフィックス用であるため、プロジェクト全体に散在させるのではなく、グラフィックスを扱う少数のクラスに使用を制限することができます。したがって、必要に応じて後でAPIを切り替えるのは非常に簡単です。ロガーの場合、問題はさらに複雑になります。

したがって、この決定は、サードパーティのライブラリが正確に行っていることと、それを変更することに伴う痛みの大きさに大きく関係していると思います。関係なくすべてのAPI呼び出しを簡単に変更できる場合は、おそらく実行する価値はありません。しかし、後でライブラリを変更するのが本当に難しい場合は、おそらく今すぐラップします。


それ以外にも、他の回答が主要な質問を非常によくカバーしているので、依存関係の注入とモックオブジェクトについての最後の追加に焦点を当てたいと思います。もちろん、ロギングフレームワークが正確にどのように機能するかに依存しますが、ほとんどの場合、ラッパーは必要ありません(おそらく、ラッパーの恩恵を受けるでしょう)。モックオブジェクトのAPIをサードパーティライブラリとまったく同じにすれば、テスト用にモックオブジェクトを簡単に交換できます。

ここでの主な要因は、サードパーティライブラリが依存性注入(またはサービスロケーターまたはそのような疎結合パターン)によって実装されているかどうかです。ライブラリ関数がシングルトンメソッドまたは静的メソッドなどを介してアクセスされる場合は、依存関係注入で使用できるオブジェクトにラップする必要があります。


1

私は強くラッピングキャンプに参加しており、サードパーティのライブラリを最も優先順位の高いものに置き換えることはできません(ボーナスですが)。ラッピングを支持する私の主な理由は簡単です

サードパーティのライブラリは、特定のニーズに合わせて設計されていません

そして、これは通常、開発者QButtonがアプリケーションを探すために8行のコードを書いてスタイルを整えるだけでなく、デザイナーが見た目だけでなく、ボタンの機能もソフトウェア全体で完全に変更されるため、数千行のコードに戻って書き直す必要が生じたり、コードベースが低レベルのアドホックな固定を散在させたため、レンダリングパイプラインを近代化するには壮大な書き直しが必要であることがわかりますリアルタイムレンダラーの設計を一元化し、その実装にのみOGLを使用するのではなく、OpenGLコードをあらゆる場所でパイプライン化します。

これらの設計は、特定の設計ニーズに合わせて調整されていません。彼らは実際に必要なものの大規模なスーパーセットを提供する傾向があり(そして設計の一部ではないものは何よりも重要ですが、何よりも重要ではありません)、それらのインターフェースは高レベルの「1これらを直接使用すると、すべての中心的な設計管理が奪われてしまいます。開発者が、必要なものを表現するために必要なレベルよりもはるかに低レベルのコードを書くことになった場合、アドホックな方法でラップすることになり、急いで書かれて大雑把に書かれた多数の結果になることがあります。適切に設計され、文書化されたラッパーではなく、設計および文書化されたラッパー。

もちろん、ラッパーがサードパーティAPIが提供するもののほぼ1対1の翻訳であるライブラリには、強力な例外を適用します。その場合、ビジネス要件と設計要件をより直接的に表現する上位レベルの設計を探す必要はありません(「ユーティリティ」ライブラリに似たものの場合があります)。しかし、ニーズをより直接的に表現する、より調整されたデザインが利用可能な場合、より高レベルの関数を使用し、インラインアセンブリコードで再利用することを強く支持するように、私はラッピングキャンプに強くいますあらゆる所に。

奇妙なことに、ボタンを作成して返す機能を設計する能力について非常に不信で悲観的に見えるように、開発者と衝突しました。上記の機能の設計と使用に関するボタン作成の詳細(将来的に繰り返し変更する必要が生じた)。これらの種類のラッパーを合理的な方法で設計することに自信がない場合、そもそも何かを設計しようとする目的すら見ていません。

別の言い方をすれば、サードパーティのライブラリは、システム設計の代替としてではなく、実装にかかる時間を大幅に節約できる可能性があると考えています。


0

サードパーティライブラリに関する私の考え:

最近、iOSコミュニティで、 サードパーティの依存関係を使用することの長所と短所(ほとんどは短所)について議論が行われています。私が見た多くの議論はかなり一般的でした-すべてのサードパーティのライブラリを1つのバスケットにグループ化しました。しかし、ほとんどのものと同様に、それはそれほど単純ではありません。それでは、単一のケースに焦点を当てましょう

サードパーティのUIライブラリの使用を避けるべきですか?

サードパーティライブラリを検討する理由:

開発者がサードパーティライブラリの使用を検討する主な理由は2つあるようです。

  1. スキルや知識の欠如。たとえば、写真共有アプリで作業しているとします。あなたはあなた自身の暗号を転がすことから始めません。
  2. 何かを構築するための時間や興味の欠如。時間に制限がない場合(人間にはまだない場合)、優先順位を付ける必要があります。

ほとんどのUIライブラリ(すべてではありません!)は、2番目のカテゴリに分類される傾向があります。このようなものはロケット科学ではありませんが、正しく構築するには時間がかかります。

それが中核的なビジネス機能である場合、それが何であれ、自分でそれを行います。

ほぼ2種類のコントロール/ビューがあります。

  1. ジェネリック、あなたも、たとえば自分のクリエイターによって考えられない多くの異なる状況でそれらを使用することができますUICollectionViewからUIKit
  2. 特定の、単一のユースケース用設計されていUIPickerViewます。ほとんどのサードパーティライブラリは、2番目のカテゴリに分類される傾向があります。さらに、最適化された既存のコードベースから抽出されることがよくあります。

未知の初期の仮定

開発者の多くは、内部コードのコードレビューを行いますが、サードパーティのソースコードの品質を当然のことと考えている可能性があります。ライブラリのコードを参照するだけで少し時間を費やす価値があります。必要のない場所でスウィズリングが使用されるなど、いくつかの赤い旗が表示されて驚かされるかもしれません。

多くの場合、アイデアを学ぶことは、結果のコード自体を取得するよりも有益です。

あなたはそれを隠すことはできません

UIKitの設計方法により、おそらくアダプターの背後など、サードパーティのUIライブラリを隠すことはできません。ライブラリは、UIコードと絡み合って、プロジェクトのデファクトになります。

将来の時間コスト

UIKitは、iOSのリリースごとに変わります。物事は壊れます。サードパーティの依存関係は、予想どおりにメンテナンスフリーになりません。

結論:

私の個人的な経験から、サードパーティのUIコードのほとんどの使用法は、ある程度の柔軟性を少しの時間で交換することになります。

既製のコードを使用して、現在のリリースをより迅速に出荷します。しかし、遅かれ早かれ、図書館の限界に達し、厳しい決断の前に立ちます。次に何をすべきか?


0

ライブラリを直接使用すると、開発チームにとってより使いやすくなります。新しい開発者が参加するとき、彼は使用されているすべてのフレームワークに完全に慣れているかもしれませんが、あなたの自家製のAPIを学ぶ前に生産的に貢献することはできません。若い開発者があなたのグループで進歩しようとすると、彼はより有用な一般的な能力を獲得する代わりに、他のどこにも存在しない特定のAPIを学ぶことを余儀なくされます。誰かが元のAPIの便利な機能や可能性を知っている場合、それらを知らない人が書いたレイヤーに到達できない可能性があります。誰かが仕事を探している間にプログラミングタスクを取得する場合、ラッパーを通して必要な機能にアクセスしているという理由だけで、彼が何度も使用した基本的なことを実証できないかもしれません。

これらの問題は、後で完全に異なるライブラリを使用するというかなり遠隔的な可能性よりも重要かもしれないと思います。ラッパーを使用する唯一のケースは、別の実装への移行が確実に計画されている場合、またはラップされたAPIが十分に凍結されておらず、変化し続ける場合です。

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