サイトがサイトで商品を販売しているとしましょう。カタログ、プロモーションページ、販売記事ページの3か所に商品を表示したいと考えています。3つの関数を作成し、それぞれでデータベースにリクエストを送信しました。
ビジネス要件の変化の典型的な例-マネージャーが私たちのところにやって来て、次のように述べています。アクティブな製品は同じ3つの場所に表示する必要があり、非アクティブな製品はどこにも表示されません。
これで、アーキテクチャが悪いか良いかを評価できます。商品を受け取るための関数は3つしかなく、正確に3つの関数で、active = trueのチェックを追加する必要があります。コードの変更の複雑さはO(n)であることがわかります。ここで、nは関数の数です。getProductsCatalog、getProductsByAction、getProductsByArticle、getRecommendedProducts、getMostViewedProductsの5つの関数があります-5つの関数を変更する必要がありますが、コードの複雑さはO(n)のみです。
1レベルの抽象化を追加すると、コードに必要な変更の数をO(1)に減らすことができます。
この例では、1レベルの抽象化を導入しましたが、変更を加える必要があるのは1か所のみです。
, , front , . :
- front , O(1). - O(n) - .. , , . - 1 . front , O(1+n) - 1 - , n - . , O(n+m), n - , m - .
O(1+n) O(1) 1 , 2.
:
O(n^2) - . 2 , 1 , , .
O(n) - . .
O(n+m) - , O(n), 1 , 2 n 1 m 2 .
O(1) - , .
O(0) - CMS . .
:
O, .
この記事では、関数の名前は気にしませんでした。P / A / HC / LC関数の命名に関する記事と、Habr参加者からのその記事のフォローアップを読むことをお勧めします。