理解する必芁がある3぀の䞻芁な゜フトりェア原則



アプリケヌションを開発するずき、私たちは垞に新しいアプロヌチ、蚀語、抂念に盎面しおいたす。 そしお、私たちは垞に「波に乗っお、すべおの倉化ず傟向を考慮に入れお競争力を維持できたすか」ずいう疑問を急いでいたす。 私のお気に入りの映画「カサブランカ」のフレヌズを思い出しお、ちょっず考えおみたしょう-愛には新しい法則はありたせん-これが光の生成方法です。



愛に関連するすべおがコヌドに適甚されたす。 コヌドには新しい法埋はありたせん。 開発の基本的な考え方を明確に理解しおいれば、新しいアプロヌチにできるだけ早く適応するこずができたす。 この蚘事では、開発の耇雑さを芏制できる他の3぀の基本原則に぀いお説明したす。 私はこの問題に察する私のビゞョンを共有したす。これはあなたの日々の仕事に圹立぀こずを願っおいたす。



也燥-繰り返しおはいけたせん



この原則は非垞に重芁なので、繰り返しは必芁ありたせん 通垞、それは悪名高い本「 実甚的なプログラマヌ 」に最初に登堎した頭字語DRYによっお蚀及されたすが、抂念自䜓は長い間知られおいたした。 ゜フトりェアの最小郚分を指したす。



倧芏暡なプロゞェクトを開発する堎合、実装党䜓の過床の耇雑さに察凊する必芁がありたす。 人々は耇雑なシステムの管理にうたく察応できず、特定の問題に察する異垞な解決策を芋぀けるこずができたす。 耇雑さを軜枛する最も簡単な゜リュヌションは、システムを管理しやすい小さな独立したモゞュヌルに分割するこずです。



耇雑さを軜枛する最も簡単な方法は、システムを管理可胜な郚分に分割するこずです。


たずえば、CMSの䞀郚は、ナヌザヌ管理を担圓するコンポヌネントです。 このコンポヌネントは、セキュリティシステムの他のコンポヌネントず連携できるアクセスレベルの管理など、他のコンポヌネントに分割できたす。



このようにシステムをより深いコンポヌネントに分割するこずで、システムの各郚分が明確に定矩されたアクションを担圓するようになりたす。 このようなアクションは、クラスに線成できたす。 クラスにはメ゜ッドずプロパティが含たれたす。 メ゜ッドは、システムのビゞネスロゞックを構築するアルゎリズムを衚したす。



DRY原則では、このような情報がコヌドに1回だけ衚瀺されるこずが必芁です。




これらのパヌツには1぀のアむデアが必芁です。



情報デヌタずその衚瀺の違いに泚意しおください。 CMSでデヌタベヌスぞの接続を敎理するず、目的のドラむバヌを生成し、承認を受け入れ、接続ぞのポむンタヌを倉数に保存するコヌドが䜜成されたす。 ここで、コヌドは、䜕か接続を取埗する方法を説明する情報です。 接続ポむンタを持぀倉数は、システム内のどこでも䜿甚できるこの情報の衚珟です。 突然承認が倉曎された堎合、プレれンテヌションではなく「デヌタ」のみを倉曎する必芁がありたす。



各デヌタには、システムの明確で信頌できるビュヌが必芁です。


理想的なシステムでは、ビゞネスロゞックの各郚分は、そのデヌタを衚珟クラスの倉数たたはプロパティにカプセル化したす。 この倉数は、アヌキテクチャの䞀郚を担圓するクラスにカプセル化されたす。 クラスは、システムの機胜の䞀郚の実装であるコンポヌネントの䞀郚です。



したがっお、システムの最䞊䜍、぀たり機胜実装の耇雑なセットに到達できたす。 この組織のアプロヌチはモゞュヌル匏アヌキテクチャず呌ばれ、DRYはその重芁な郚分です。





アヌキテクチャのタスクは耇雑さを管理するこずです




繰り返すのをやめる


繰り返しを排陀する方法はかなりありたす。 ハントずトヌマスは、コヌドゞェネレヌタヌずデヌタ倉換を提䟛しおいたす。 しかし、DRYは最終的に、衚珟を通じおロゞックを提䟛するずいう哲孊です。

アプリケヌションの各郚分はプレれンテヌションにするこずができ、各郚分は特定のロゞックを提䟛したす。蚱可管理モゞュヌルはナヌザヌぞのアクセスを提䟛し、ナヌザヌクラスには珟圚のナヌザヌに関する情報ずそのプロパティセットが含たれたす。 このクラスは、デヌタベヌスビュヌを介しおデヌタを受け取りたす。



DRYは、ロゞックを衚珟に分解する哲孊です。


DRYずモゞュラヌアヌキテクチャには、適切な蚈画が必芁です。 ビュヌの階局を適切に線成するには、システムを、連携しお機胜する小さな郚分に分割したす。 倧芏暡なプロゞェクトを管理する必芁がある堎合は、DRYを䜿甚しおコンポヌネントでプロゞェクトを敎理するこずを怜蚎する必芁がありたす。 次のルヌルに埓うようにしおください。





デヌタベヌスドラむバヌは、実際のプロゞェクトに他の倚くのレベルのロゞックを含めるこずができるため、やや軜量な䟋です。たた、特に最新の蚭蚈パタヌンを考慮するず、より小さなコンポヌネントに分割できる領域が倚くありたす。 しかし、あなたがただ違反したずしおも、重芁なこずを忘れないでください



突然このコヌドをすでに曞いた/䌚ったこずを自分自身でずらえたら、やめお、考えお、繰り返さないでください。


実際のプロゞェクトでは、100DRYを達成するこずはほずんど䞍可胜です。 しかし、順番に、受け入れられないレベルで非也燥であり、管理が難しいプロゞェクトがたくさんありたす。 そしおおそらくこれはあなたを驚かせるでしょう-すべおのプロゞェクトの50が圌らのコヌドを芋れば倱敗したす。



倚くの人は、悪いプログラマヌが悪いコヌドを曞くず考える傟向がありたす。 私の経隓では、これはむしろ䟋倖です。 垞に悪いコヌドは、䌚蚈士によっお曞かれおいるこずがほずんどです。 それでも、䌁業のプロセス管理を䞍適切に蚭定するず、䞍正なコヌドが生成されたす。



䟋


䟋ずしお、コヌドの品質ずその管理に問題がある䌚瀟に技術コンサルタントずしお招埅されたず想像しおみたしょう。 コヌドを芋るず、倚くのハックがあり、コヌドがDRYではないこずがわかりたした。 これは䞍良コヌドの最初の症状ですが、原因ではありたせん。 コミットの履歎を芋るず、これらのハックがプロゞェクトの最終段階期限、マむルストヌンで䜿甚された可胜性が高いこずがわかりたす。 ストヌリヌを分析した埌、芁件のいく぀かの倉曎がこれらの同じハッキングを䌎うこずを理解したす。



たれに悪いコヌドは、悪いプログラマヌによっお曞かれたす。


優れた蚈画によっお再珟性が排陀されるこずを芚えおいたす。 システムの緊急の倉曎には、コヌドの緊急で最適でない解決策が必芁です。 コヌドが䞍適切な決定にさらされるずすぐに、この゜リュヌションのDRY原則党䜓が、将来の倉曎たで機胜しなくなりたす。



最も成功しおいるIT䌁業の歎史を芋るず、それらの倚くは問題を理解しおいる人々によっお䜜成されたした-ビルゲヌツ、マヌクズッカヌバヌグ、スティヌブりォズニアック、スティヌブゞョブズ、ラリヌペむゞ、セルゲむブリン、ラリヌ゚リ゜ン特定の問題の解決策。 しかし、システム管理を䌚蚈士の手に移し、抂念をコンサルタントの手に移す䌚瀟がありたす。 どちらもそのような領域を管理するこずはできたせん。



DRYは、共同蚈画によっお達成されたす。


そのため、倚くの゜リュヌションは、Powerpoint、Photoshop、および27むンチの画面でのみ機胜したす。 これは、ある皋床静的なサむトで郚分的に機胜したした。 しかし、今日ではなく、さたざたなむンタラクティブなアプリケヌションやデバむスがたくさんある䞖界では。



そしお、チェヌンの最埌にいるプログラマヌは、システムの゚ラヌを玠早く修正する矩務がありたす。 顧客の気たぐれに毎分耐えるこずができない䌚蚈士に慣れおいる堎合、すべおの蚈画が地獄に行き、非垞に悪いコヌドが曞かれたす。 コヌドはDRYではなくなりたした。



この䟋は少し悲芳的ですがよく芋かけたすが、DRYは倚くの人々が䟝存しおいる抂念であるこずを明確に瀺しおいたす。 あなたが突然始たったばかりの䌚瀟で突然働いおいる堎合、プロセスの倉曎を提案するこずをお勧めしたす䟋えば、プロゞェクトの初期段階での技術的評䟡。



必芁のないずころに錻を突かないように頌たれたら、読み進めおください-YAGNIの原則はあなたを救いたす



KISS-シンプルにバカにしお物事を簡単にする



19䞖玀の終わりに、物理孊者は、重力、磁堎、光孊が遠距離-倪陜系内の距離でどのように機胜するかの説明を芋぀けようずしたした。 これらすべおの力に䜜甚する特定の゚ヌテルの存圚に぀いお理論が導き出され、説明するこずはできたせん。 埌にこの理論はいく぀かの実隓によっお拡匵されたしたが、問題を説明したものはありたせんでした。



倚くの堎合、最も単玔な説明が最も正しい解決策です。


少し埌に、スむスの特蚱事務所の埓業員であるアルバヌト・アむンシュタむンは、この理論を攟棄し、距離の蚈算をすべお無芖し、時間は䞀定ではないず単玔に仮定するこずを提案したした。 最小数の䟝存関係を考慮したこのような問題の解決策は、「Occamの剃刀」の原理によっお説明されおいたす。



同様の抂念は倚くの分野で芋られたす。 ゜フトりェア開発および他のいく぀かでは、KISSず呌びたす。 この頭字語には倚くの意味がありたすが、それらはすべお䞀぀のこずに垰着したす-できるだけシンプルにするようにしおください。





人類の歎史における進歩のほずんどは、䞊倖れた思想家のおかげです。




HTTP


HTTPプロトコルは、もずもずハむパヌテキストドキュメントの転送甚に䜜成された理想的なシンプルな゜リュヌションの䟋ずしお非垞によく匕甚されおいたすが、今日では倚くのむンタラクティブアプリケヌションの基盀ずなっおいたす。 おそらく、このプロトコルの制限に関連する問題の回避策を探す必芁があり、将来的には別のプロトコルに眮き換えられる可胜性がありたす。 しかし、今日に぀いおは、いく぀かの芁求メ゜ッドGET / POST、ステヌタスコヌド、および単玔なテキスト匕数に基づいお、HTTPは非垞に柔軟で信頌性が高いずいう事実が残っおいたす。 これが、りェブ開発者が最倧限に掻甚しようずしおいる理由であり、このプロトコルがただ運甚されおいる理由です。



物事を簡単にするためのアプロヌチはかなり明癜ですが、゜フトりェア開発の歎史にはさたざたな悪い、生の決定がたくさんありたす。 それらはしばしば別の単語ず呌ばれたす-ブロヌトりェア、たたはDOA到着時に死亡-出生時に死亡。 このような゜フトりェアに関連しお、非DRYコヌドの理論に類䌌した理論を適甚できたす...それでも、むンタヌネットの成功は、シンプルで効果的な゜リュヌションによっお説明できたす。



それでは、可胜な限りシンプルな゜リュヌションを最倧限に実珟する方法は それはすべお、サポヌトの可胜性ず゜フトりェア開発の詳现に垰着したす。 そのため、芁件定矩フェヌズでKISSを適甚する必芁がありたす。 コヌドにクラむアント芁件を実装しようずしお、次の点を匷調しおみおください。





どういうわけか、クラむアントがExcelスプレッドシヌトを人事管理プログラムにむンポヌトするプロゞェクトに参加したした。 良い䟋です。 Excelは、耇雑な圢匏の専甚アプリケヌションです。 文曞の圢匏は耇雑です。なぜなら、 豊富な機胜を実装したす-たずえば、グラフィックスやその他のチップを远加できたすが、実際にはクラむアントには必芁ありたせんでした。 圌はテヌブルの数字だけが必芁でした。 したがっお、Excelからのむンポヌトを導入するには、䞍必芁な機胜に倚くの時間を費やす必芁がありたす。 さらに、Excelにはいく぀かのバヌゞョンがあり、毎幎たすたす増えおいたす。 ぀たり このすべおを管理するのは困難であり、将来的に远加コストのリスクがありたした。



そしお、CSV圢匏からのむンポヌトを導入するこずにしたした。 この゜リュヌションは数行のコヌドを必芁ずし、デヌタで過負荷にならずCSV圢匏ずExcel圢匏を比范する堎合、管理ず保守が簡単でした。 Excelは、CSV圢匏でデヌタを簡単に゚クスポヌトできたすクラむアントが将来䜿甚できる他の倚くのプログラムず同様。 たた、この芁件を実装するための最小限のコストを考えるず、この゜リュヌションはKISSの優れた䟋です。



道埳-耇雑に芋える堎合は、単玔な偎面から物事を芋おみおください。 実装があなたには難しいず思われる圌の芁件をクラむアントがあなたに告げるならば、あなたはどんな堎合でも正しいです。 実装が非垞に難しいこずを考慮しおも、䞍圓に過負荷になる゜リュヌションに遭遇するこずがよくありたす。 これは、 開発プロセスには、費甚/䟿益を正しく蚈算するための技術的な専門知識を持たない人が含たれたす。 そしお、圌らは問題党䜓を芋おいたせん。 したがっお、垞にクラむアントの芁件を再確認し、これがたさにクラむアントが必芁ずしおいるものであるこずを確認しおください。 重芁なポむントに぀いお話し合い、他の゜リュヌションがより効果的になる理由を説明しおください。



あなたはそれを必芁ずしたせん-あなたはそれを必芁ずしたせん



GoogleがGoogle+を開始したずき、Facebookの創蚭者であるMark Zuckerbergは、゜ヌシャルネットワヌクに登録された最初の人物の1人であり、圌のネットワヌクを䞊回るように蚭蚈されたした。 圌は、「自己に぀いお」セクションに「I Build Things」ずいう1行だけを曞きたした。 個人的には、これは玠晎らしい提案であり、プログラミングの本質を明らかにしおいたす。 なぜ゚ンコヌダパスを遞択したのですか 技術的゜リュヌションぞの熱意 効率の矎しさ 答えが䜕であれ、「暙準機胜を備えた100500番目の䌁業サむトを構築する」こずはほずんどないでしょう。 それにもかかわらず、私たちの倚くはたさにそれを獲埗しおいたす。 どこで仕事をする堎合でも、退屈な日垞業務に察凊する必芁がある堎合がありたす。



プログラミング䞭です。 物を䜜りたす。


「あなたはそれを必芁ずしない」ずいう原則YAGNIは、そのような問題を解決するために蚭蚈されおいたす。



これは、システムで意図されおいないものがコヌドに衚瀺されないこずを意味したす。 たずえば、倚くの堎合、デヌタベヌスぞのアクセスは抜象化を介しお行われたす。抜象化には、さたざたなドラむバMySQL、PostgreSQL、Oracleの実装が含たれる堎合がありたす。 LAMPスタックでホストされおいるサむトで䜜業しおいる堎合、クラむアントがデヌタベヌスを倉曎する可胜性はどのくらいですか コンセプトは垞に予算の䞋で曞かれおいるこずを忘れないでください-右



予算がデヌタベヌスの抜象化を提䟛しない堎合-この抜象化はシステム内にあるべきではありたせん。 クラむアントが突然別のデヌタベヌスに移動する必芁がある堎合、これはシステムを倉曎するコストを䌎うこずは明らかです。



YAGNIシステムずDRYシステムの違いに気付いたはずです。 埌者はシステムを管理可胜なコンポヌネントに分割するこずで耇雑さを軜枛するように蚭蚈されおいたすが、前者はこれらのコンポヌネントの数を枛らすこずで耇雑さを軜枛したす。 YAGNIの原理はKISSに䌌おいたす-それは物事を可胜な限り単玔化しようずしたす。 しかし、KISSは簡単な解決策を芋぀けようずしおいたすが、YAGNIは決定を䞋したせん。



アメリカのサむ゚ンスフィクションラむタヌであるセオドアスタヌゞョンは、「すべおの90が完党なゎミである」ずいう法埋を提案したした。 かなり急進的な声明であり、実際のプロゞェクトに垞に適甚できるずは限りたせん。 「ナンセンス」には倚くの時間がかかるこずを忘れないでください。 蚘述されおいないルヌルがありたす。開発に費やされた時間の玄80は、システムの機胜のわずか20の実装に費やされたす。 プロゞェクトを芚えおおいおください。 自分のレビュヌをするたびに、80/20ルヌルがどのように機胜するかを垞に確認しおいたす。



開発に費やした時間の80は、システムの機胜のわずか20の実装に費やされおいたす。


この戊略は、明確ではない抂念が混圚する期限に準拠するこずが慣習ずなっおいる䌁業に非垞によく適甚されたす。 DBの抜象化に誰も感謝したせん。 䞊叞がデヌタベヌスの抜象化ずは䜕かを知らない可胜性さえありたす。



ただし、このアプロヌチがかなり単玔に芋える堎合でも、䞍芁な郚分から必芁な郚分を分離するのはそれほど簡単ではありたせん。 たずえば、抜象化を実装しおいる堎合でも、デヌタベヌスをダンプするずきに䜕も埗られたせん。 重芁なポむントは、゜フトりェアをどのように芋おいるかです。メンテナンスが容易で、将来利益を䞊げるコヌドを曞くように教えられたした。 ぀たり すべおの可胜な倉曎を考慮しお、先を芋越すように教えられたした。 これは倧芏暡なプロゞェクトでは重芁ですが、小芏暡なプロゞェクトでは重芁ではない堎合がありたす。 未来に぀いお考えるのをやめおください 急に小さなサむトで急進的な倉曎が必芁になった堎合、最初からやり盎した方が良いでしょう。 党䜓的な投資を考えるず、これはそれほど問題ではありたせん。



プロゞェクト蚈画



新しいプロゞェクトを蚈画するずきは、次のこずを考慮しおください。





これを詳しく芋おみたしょう。 最初の点で、すでに䟋を瀺したした-デヌタベヌスドラむバヌに抜象化を実装しないでください。 システムを耇雑にする可胜性のあるすべおのものを慎重に評䟡しおください。 倚くの堎合、倚くの抜象化がサヌドパヌティ補品およびラむブラリに実装されおいるこずに泚意しおください。 たずえば、䜜成する蚀語に応じお、HibernateJava、DoctrinePHP、Active RecordRubyのいずれにも、デヌタベヌスおよびORMの抜象化レベルが付属しおいたす。 これらの各ラむブラリは耇雑さを増したす。 そしお、それは制埡されなければなりたせん。 曎新、パッチ、セキュリティ修正-これらはすべお、今埌実行/適甚する必芁がありたす。



毎日圹立぀ず思われる新機胜を玹介しおいたす。 したがっお、私たちは先を考え、実珟しすぎおいたす。 たずえば、倚くの顧客はモバむルバヌゞョンのサむトを持ちたいず考えおいたす。 モビリティはさたざたな意味で衚すこずができたすが、これは必ずしも蚭蚈䞊の決定事項ではありたせん。 これはナヌスケヌスです モバむルサむトを䜿甚する人はモバむルです。 ぀たり、デスクトップバヌゞョンを䜿甚する情報以倖の情報や機胜が必芁になる堎合がありたす。 映画通のりェブサむトを想像しおみおください。映画通に行く途䞭、バスに乗っおいるナヌザヌは、50メヌトルの予告線ではなく、セッションの開始時刻を芋たいず考えおいたす。



十分な予算があれば、モバむルバヌゞョンの芁件を個別に分析しようずしたす。 このような分析がなければ、単にデスクトップの堎合ず同じ情報を提䟛するだけです。 そしお、これは倚くのプロゞェクトにずっお十分かもしれたせん。 今日、倚くのモバむルブラりザはサむトの倖芳を適切に構成できるため、ここではYAGNIの根本的なアプロヌチを適甚できたす。モバむルバヌゞョンを䜜成しないでください。



悪い抂念は、倚くの堎合、機胜以倖の芁件がないこずで特定できたす。


非機胜芁件はシステムの動䜜を説明するものではなく、補品の品質を評䟡するために䜿甚できる远加のプロパティを説明したす。 なぜなら 品質の説明には補品の知識が必芁であり、機胜しない芁件がないこずで、貧匱な抂念を特定できるこずがよくありたす。 サポヌトする機胜、ドキュメントのレベル、統合の容易さは、すべお非機胜芁件の䟋です。 これらの芁件は枬定可胜でなければなりたせん。 ぀たり 「サむトは迅速にロヌドする必芁がありたす」は䞀般化されすぎおいたすが、「パフォヌマンステスト䞭にサむトは2秒でロヌドする必芁がありたす」は非垞に具䜓的で明確です。 YAGNIアプロヌチを適甚する堎合は、抂念で考慮されおいないたたは考慮されおいるが、あたり明確ではない堎合でも、いく぀かの非機胜芁件を考慮しおください。 このような芁件を䜜成するずきは、珟実的に考えおください。1日あたり20〜50の蚪問がある小芏暡なサむトでは、3日間のパフォヌマンスチュヌニングは必芁ありたせん。 サむトはすぐにロヌドされるため、サヌバヌが過負荷にならない堎合。 䌁業が出垭を増やしおも、より匷力なホスティングを賌入するこずは問題になりたせん。



そしお最埌に、垞に80/20ルヌルを芚えおおいおください。 時間のかかるタスクを特定しおください。 そのようなタスクが必須の堎合、それを行う必芁がありたす。 問題は、その方法だけです。 小さなコミュニティで別のフレヌムワヌクが必芁ですか ラむブラリのドキュメントがただ曎新されおいない堎合、最近リリヌスされたラむブラリのバヌゞョンにアップグレヌドする必芁がありたすか 新しいCMSのすべおの拡匵機胜が機胜しおいない堎合、新しいCMSを䜿甚する必芁がありたすか あなたの仕事を実珟するために、どの皋床詳现な分析を行う必芁がありたすか 「垞にこれをしなければならない」アプロヌチはあたり゚キサむティングではありたせんが、驚くこずなく問題を解決するのに圹立ちたす。



たた、これらのすべおが、あなたが座っおハックで味付けされた悪いコヌドを曞くこずができるずいう意味ではないこずを理解するこずも重芁です。 あなたは小さなアプリケヌションを曞いおいるだけで、 悪いものではありたせん ただし、「必芁ない」アプロヌチは非垞に実甚的です。 それが数行のコヌドを枛らすのに圹立぀なら、私はあなたがこの仕事を予算に入れるこずができるず個人的に思いたす、そしお少しの非DRYは党く受け入れられたす。 ぀たり サポヌト費甚がわずかに増加するわけではないこずに同意するこずができたす-私たちは珟実の䞖界に䜏んでいたす。



基本的な考えに戻りたしょう-物を䜜りたす。 ベヌトヌノェンは契玄曞に「ディアベリ倉奏曲」を曞いた。 私は圌が予算で劥協したずは思わない。 圌はより倚くの時間を費やしたしたが、悪い音楜をリリヌスしたせんでした-圌は完璧な曞き方を求めたした。



もちろん、私たちはすべお倩才であり、私たちの倩才がすべおのコヌド行に瀺されるべきだずいう意味ではありたせんが、゜フトりェアアヌキテクチャを䜜曲ずしお考えるのが奜きです。 私は完璧なコンポゞションを構築したいので、情熱的な開発者であり、自分が構築したものを誇りに思っおいたす。



経隓豊富で人気のある開発者になりたい堎合は、原則ずしおYAGNIでスキルを磚く必芁がありたす。 情熱を持ち続けたいなら、垞に抵抗しなければなりたせん。




おわりに



゜フトりェアの原則は、この゜フトりェアの芳点です。 私にずっお、良い原則は、他のアプロヌチや哲孊に盎面したずきに、アむデアの耇雑なデザむンに進化するべきシンプルなコンセプトに基づいおいるべきです。 奜きな゜フトりェアの原則は䜕ですか



All Articles