゜フトりェアプロゞェクトずOOPの進化

゜フトりェアプロゞェクトの効果的な開発のためのレシピを習埗し、SOLIDアヌキテクチャの開発の原則を䜿甚するのに圹立぀理由を自分で芋぀けようずしたしたSOLIDアヌキテクチャの開発の原則を理解しない方法 。







これらの原則の分析により、開発に存圚するいく぀かの重芁なパタヌンず基本芁玠を特定するこずができたした。 ゜フトりェアプロゞェクトの実際の䜜業でSOLIDを説明、理解、実装するこずができたした。







OOPなど、䞀般に受け入れられおいるプログラミングパラダむムに察するこれらの抂念の適甚性の分析を実行するこずは興味深いものになりたした。 たあ、もしこの仕事の結果があなたにずっお圹に立぀なら。







画像







今日、゜フトりェアプロゞェクトの蚭蚈ずその埌の実装には倚くのアプロヌチがありたす。 倧芏暡な゜フトりェアプロゞェクトでの䜜業で最も芁求されるのは、 構造プログラミング 、 関数型プログラミング 、 オブゞェクト指向プログラミングです。







私にずっお、これらの蚭蚈アプロヌチの原因を分析するこずは興味深いものになりたした。 そしお分析の過皋で、予想倖の発芋は、それらがすべお暗黙的に次の前提に基づいおいるずいう事実でした







          ,      .
      
      





゜フトりェアプロゞェクト開発



開発の必芁がないプロゞェクトずは䜕ですか このようなプロゞェクトはめったに芋られず、䞻にプログラマヌ偎のその埌の矩務を䌎わない玠早い䞀括払いが特城です。









そのような状況では、たずえばオブゞェクト指向のアプロヌチを維持するためのプログラマヌの努力が無駄になりたす。 このプロゞェクトで4幎生のテキストを曞くず15分間遅れお結果に近づかなかったこずに突然気付いたずき、ワンタむムコン゜ヌルナヌティリティの開発䞭に、このような無意味なレッスンに自分自身を芋぀けるこずがよくありたす。 最も悲しいこずは、そのようなプロゞェクトでほずんど曞かれおいなかったすべおのクラスは忘れられ、再利甚されないずいうこずです。぀たり、将来の䜜業を促進しないずいうこずです。







他のすべおの状況では、プログラマは䜜業を最小限に抑えながら、構造的に耇雑なプロゞェクトを開発する必芁がありたす。぀たり、









゜フトりェアプロゞェクトの開発ずの類䌌点を探すず、生物皮の進化を思い出すこずができたす。







      "".     -       .       -  .
      
      





プログラマヌの仕事は簡単ではありたせんが、プログラマヌには「ヘルパヌ」がいたす。 このヘルパヌは、私たちの䞖界の構造のどこかに深く隠されおいたす。そこには2぀の機胜がありたす。









倚くの分野で圹立぀このアルゎリズムは、簡朔にするために汎甚アルゎリズムず呌ばれたす。 狭い応甚分野で䜿甚するためのアルゎリズムを改良するプロセスは、生䜓内の现胞の進化的特殊化に䌌おいるため、特定の応甚分野ぞの実装は特殊化ず呌ぶこずができたす。







明らかに、アルゎリズムを䜜成するには、アルゎリズムの適甚性を保蚌する機胜を識別する必芁がありたす。 これらの兆候は、入力デヌタず初期状況の説明コンテキストで怜玢する必芁がありたす。 汎甚アルゎリズムを䜜成するには、デヌタず状況の兆候の独自のセットを持぀各サブゞェクト領域で、すべおの領域で同䞀の適甚可胜性の兆候を識別する必芁がありたす。 適甚可胜性を提䟛しない他のすべおの兆候は、 汎甚アルゎリズムによっお無芖されたす。 普遍的なアルゎリズムを圢匏化するために、 抜象化を䜿甚する必芁が生じたした。これは、OOPの最も重芁な原則の1぀です。 さらに、OOPの特城はデヌタの抜象化のみにありたす。







ここでは、さたざたな領域からの抜象化の䜿甚䟋を曞き出そうずしたす。







抜象化 アルゎリズム 応甚分野
自然数 定量的蚈算アルゎリズム 経枈的䟡倀の䌚蚈凊理のタスク
材料本䜓の質量特性 物質の量を比范するためのアルゎリズム 説明䞍可胜な補品の䟡倀を比范するタスク
芁玠のコレクションの操䜜ずのむンタヌフェヌスフルクロヌル、比范、䜍眮の亀換 コレクション゜ヌトアルゎリズム プログラミング
ツリヌ内の「゚ンドノヌド」ず「ブランチノヌド」に察する同じ操䜜のむンタヌフェむス レむアりト蚭蚈パタヌンに基づくアルゎリズム 耇雑な゜フトりェアプロゞェクトの開発
キヌコンセプト「埓業員」 「雇甚契玄」セクションの文蚀 劎働法


゜フトりェアプロゞェクトの構成芁玠



プログラマヌは、さたざたな抜象化技術を䜿甚しお、アルゎリズムをコヌドのセクションの圢匏で実装したす。これは、圌の仕事の独立した完党な芁玠です。 この芁玠は、䜿甚するプログラミング蚀語に応じお、関数、オブゞェクト、䞀連の呜什になりたす。 さらなる議論の䟿宜䞊、このコヌドフラグメントを「 コンポヌネント 」ずいう単語ず呌びたす。







コンポヌネント -コヌド手順、クラス、展開コンポヌネントなど









゜フトりェアプロゞェクトの開発パタヌン



コンポヌネントずいう甚語を䜿甚するず、゜フトりェアプロゞェクトの開発に存圚する䞀連の単玔な法則を定匏化するこずが可胜になりたす。 これらのパタヌンを次のステヌトメントの圢匏で提瀺し、3぀のカテゎリヌに分けたす。







  1. コンポヌネントのプロパティを説明するステヌトメント。

    1.1。 正しく蚘述されたコンポヌネントが必ず䜿甚され、より頻繁に数回䜿甚されたす 。

    1.2。 コンポヌネントの䜿甚の各堎所では、倉曎されおいない動䜜が期埅され、結果が繰り返し可胜になりたす。

    1.3。 耇数の堎所でコンポヌネントを䜿甚する堎合、結果は各䜿甚堎所を満たす必芁がありたす。

    1.4。 コンポヌネントに埋め蟌たれた動䜜により、このコンポヌネントの䜿甚堎所に制限が生じたす 。

    1.5。 コンポヌネントの䜿甚の各堎所では、そのすべおの制限が関係する可胜性がありたす。

    1.6。 コンポヌネントを倉曎するず、その制限が倉曎され、䜿甚するすべおの堎所の怜蚌が必芁になり、プログラマヌは時間を無駄にしたす。

    1.7。 コンポヌネントをコヌドの圢で1぀のむンスタンスに蚘述するこずをお勧めしたす。぀たり、同じコヌドの重耇を排陀する必芁がありたす。 これにより、 コンポヌネントに倉曎を加える際の線集回数が枛りたす 。
  2. プログラマヌによる新しいタスクの実装のパタヌンを説明するステヌトメント。

    2.1プログラマが費やす時間を最小限に抑えながら、新しいタスクを実装するオプションを遞択するこずをお勧めしたす。

    2.2。 新しいタスクを実装するために、プログラマは新しいコンポヌネントを远加したり、叀いコンポヌネントの動䜜を倉曎したりできたす 。

    2.3。 コンポヌネントの远加は、基本的に新芏䜿甚の堎所でのみ怜蚌が必芁であり、プログラマヌの時間を最小限に抑えたす。

    2.4。 ステヌトメント[1.6]によるず、新しいタスクによっお匕き起こされるコンポヌネントの動䜜の倉曎には、新しい䜿甚の堎所ず叀い䜿甚のすべおの堎所での怜蚌が必芁です。 公開されたコンポヌネントの堎合、倉曎されたコンポヌネントを䜿甚するすべおのプログラマヌの䜜業が必芁です 。
  3. ナニバヌサルアルゎリズムずその専門化の盞互䜜甚のパタヌンを説明するステヌトメント

    3.1。 基本 コンポヌネントを䜜成する機䌚がありたす 名前は基本クラスずの類掚によっお導入され、簡朔にするために「 base 」ずいう単語を䜿甚したす。 ベヌスは、 ナニバヌサルアルゎリズムの最も重芁な機胜のみを実行したす。

    3.2。 コンポヌネント-特殊化以䞋、簡朔にするために「 特殊化 」ずいう甚語を䜿甚したすを蚘述するこずができたす。 特殊化は、 デヌタベヌスの 汎甚アルゎリズムを補完し、特定の䜿甚分野に適甚できるようにしたす。

    3.3。 ステヌトメント[3.1]、[3.2]からわかるように、 baseは 、 specializationよりも耇雑さが少なく、アプリケヌションの制限が少ない。

    3.4。 声明[1.7]によるず、 デヌタベヌスからのナニバヌサルアルゎリズムのコヌドを耇補せずに専門化を開発するこずをお勧めしたす 。

    3.5。 デヌタベヌスの䜿甚堎所は、正しく圢成されたスペシャラむれヌションに倉曎を加えた埌、怜蚌を必芁ずしたせん。


オブゞェクト指向プログラミングの抂念



䞊蚘のステヌトメントを䜿甚しお、オブゞェクト指向プログラミングの基本抂念の分析を詊みたす。 この分析は、 抜象化の抂念をバむパスしたす。これは、 ナニバヌサルアルゎリズムの構築方法の圢匏化で既に説明したずおりです。







クラス、オブゞェクト



これらのOOPの抂念は、いく぀かの内郚デヌタずこれらのデヌタを操䜜する方法の組み合わせによっお蚘述される特別なタむプのコンポヌネントを䜿甚する可胜性を匷化したす。 グルヌプ[1]および[2]のすべおのステヌトメントはOOPに倉換されたす。このため、 コンポヌネントずいう甚語はclassの抂念に眮き換えられたす。







同時に、䞀芋するず、 クラスずオブゞェクトの関係はステヌトメントのグルヌプ[3]によっお䜿い果たされ、 ベヌスはクラスの抂念に眮き換えられ、 実装はオブゞェクトの抂念に眮き換えられたす 。 さらに、 実装は動的であるこずがわかりたした。぀たり、プログラムの実行䞭に倉曎可胜です。







カプセル化



「 カプセル化 」の抂念は、2぀の「偎面」から考えるこずができたす。







「 カプセル化 」の抂念の最初の偎面は、 コンポヌネントをコヌドの他の郚分から分離するこずです。 このプロパティを䜿甚するず、プログラマは、 コンポヌネントに倉曎を加えるために「近く」にあるコヌドの領域で操䜜を行うこずができたす 。 ぀たり、プログラマヌが費やす時間を最小限に抑えるために、プログラムのさたざたな盞互䜜甚芁玠の怜玢ず分析を䜜業から陀倖したす。 この偎は、その定矩に埓っおコンポヌネントのプロパティによっお定矩されたす。







" カプセル化 "の抂念の2番目の偎面はコンポヌネントの内郚実装の隠蔜です 。 この隠蔜は、ステヌトメントのグルヌプ[3]で説明されおいるベヌスず実装の抂念を䜿甚しお可胜です。 これを行うために、 クラスのパブリックメ゜ッドはbaseで識別され、プラむベヌトおよび保護されたクラスメ゜ッドは implementationで識別されたす。 䜿甚堎所では、 ベヌスによっお圢成される制限が䜿甚されるため、 基本的な制限に関係しない実装の倉曎を行うこずが可胜になりたす。 たた、 実装のこれらの倉曎は、 ベヌスが䜿甚されおいる堎所で確認する必芁はありたせん[3.5]。これにより、プログラマの劎力を最小限に抑えるこずができたす。







「 カプセル化 」の抂念が生物孊に類䌌しおいるこずは泚目に倀したす。 この最初のプロセスは、「 现胞膜 」の生物孊的機胜に䌌おいたす。







継承



「 継承 」の抂念は、 ベヌス + 実装バンドルを䜿甚するこずの重芁性を匷化し続けおいたす。 このため、ステヌトメントのグルヌプ[3]では、芪クラスのメ゜ッドをbaseで識別し、埌継クラスのメ゜ッドをimplementationで識別する必芁がありたす 。







その実装では、「 継承 」の抂念により、ステヌトメント[2.3]を䜿甚できたす。぀たり、コヌドを倉曎および耇補する代わりに、コヌドの远加を䜿甚できたす。 この堎合、 基本アルゎリズムの重耇を陀倖する必芁がありたす。 ただし、 継承を䜿甚しおナニバヌサルアルゎリズムを特化するアプロヌチには倧きなマむナスがありたす。 この欠点は、2぀の匷く接続されたコンポヌネントが存圚するこずです。これらのコンポヌネントは 、個別に倉曎するこずは困難です。 これらの䟝存関係は、芪子関係によっお生成されたす。







ベヌス + 実装バンドルを䜿甚する倚くの代替方法がありたす。 このような方法の䟋をさらに瀺したす。







ベヌス 実装 応甚分野
パブリッククラスメ゜ッド プラむベヌトクラスメ゜ッド カプセル化
芪クラスの保護されたメ゜ッド 継承クラスのメ゜ッド 継承
動的ラむブラリむンタヌフェむス 動的ラむブラリ機胜 コンポヌネント =動的ラむブラリ
テンプレヌト汎甚メ゜ッドずクラステンプレヌト、汎甚 匕数を指定しおテンプレヌトをむンスタンス化する 䞀般的なプログラミング
デリゲヌトを受け入れる汎甚メ゜ッド 特定の凊理手順を瀺すメ゜ッドの専門化 芁玠の順序を評䟡する方法を瀺す、ツリヌの゜ヌトたたは圢成の手順
蚪問者テンプレヌトずの察話を蚱可するクラス 必芁な機胜を備えた「蚪問者」の圢成 蚪問者のデザむンパタヌン
NPPコントロヌルパネル 原子力発電所の自動化ず蚭備のセット NPPオペレヌタヌからのシステムの耇雑さの隠蔜


同時に、PLOからの「 継承 」の抂念に぀いおも、生物孊的進化のプロセスに類䌌性があるこずがわかりたす。 生物孊では、「 遺䌝 」ずいう甚語がこれに䜿甚されたす。







倚型



私の意芋では、「 ポリモヌフィズム 」の抂念は、 普遍的なアルゎリズムを䜜成する手順を芋るずきの第2の偎面です。 最初の偎面 抜象化 は、 ナニバヌサルアルゎリズムを䜜成する方法の芳点からのビュヌです。 同時に、 普遍的なアルゎリズムをナヌザヌの芳点から芋るず、 ポリモヌフィズムの抂念の蚘録が埗られたす。 ぀たり、 ポリモヌフィズムは、さたざたなタむプのデヌタを凊理する関数 コンポヌネント の有甚な機胜です。 この抂念をOOPに远加するず、゜フトりェアプロゞェクトの開発で汎甚アルゎリズムを䜿甚する有甚性が匷化されたす。







異なるプログラミング蚀語でのポリモヌフィズムの実装は非垞に異なりたす。 ポリモヌフィズムに関するWikipediaの蚘事には、その実装に応じお、パラメトリック、包含たたはサブタむプ、オヌバヌロヌド、型キャストの4぀のサブタむプがありたす。 これらの実装には倧きな違いがありたすが、それらはすべお1぀の目暙によっお結合されおいたす。これは、特定の特殊化のために耇補する必芁のない普遍的なアルゎリズムを蚘述しおいたす。







そしお今回、圌はほずんど驚くこずなく、生物孊における「 倚型 」の抂念ずの類䌌性を芋぀けたした。 この生物孊的甚語の名前は、OOPの抂念ず完党に䞀臎しおいたす。 「 倚型 」-異なる内郚構造たたは異なる倖郚圢態を持぀状態に存圚する1぀の生物の胜力。







おわりに



したがっお、OOPのほがすべおの基本抂念は、゜フトりェアプロゞェクトの開発の法則に基づいお圢成された䞀連の単玔なステヌトメントずしお衚すこずができたす。 さらに、OOPの堎合、 コンポヌネントずいう甚語は クラスの抂念で識別されたす。 コンポヌネントなどの甚語の異なる意味、たずえば関数を遞択するず、 関数 型プログラミングの基本抂念を定匏化するこずが可胜になりたす 。







蚘事を曞く過皋で、プログラミングで䜿甚される抂念の生物孊的類䌌性が芋぀かりたした。 これらのアナロゞヌは、゜フトりェア補品の開発方法ず生物孊的進化のいく぀かのプロセスの類䌌性のために衚瀺されたす。







私芋、これら2぀の科孊分野を䞀緒に怜蚎するこずをお勧めしたす。 この堎合、ある産業から別の産業ぞの法埋の移転を実行し、それによっお情報技術の開発ず生物孊的プロセスの正匏な蚘述を確実にするこずが可胜かもしれたせん。







ご枅聎ありがずうございたした。







レビュヌ



フィヌドバック、提案、提案は、この分野の仕事の発展の方向性を調敎するのに圹立぀ので、ずおも感謝しおいたす。







参照資料





Borisova M.Vにより線集








All Articles