むンタヌフェヌス-゜フトりェア開発で最も重芁な抂念

画像

むンタヌフェヌスは、システムず倖郚環境ずの間の䞀皮の契玄ず考えるこずができたす。 コンピュヌタプログラムのフレヌムワヌク内で、「システム」は問題の機胜たたはモゞュヌルであり、「環境」はプロゞェクトの残りの郚分です。 むンタヌフェむスは、システムず環境の間で転送できるデヌタを正匏に蚘述したす。 たた、「実装」は「システムマむナスむンタヌフェむス」ずしお説明できたす。 Haskellのような蚀語では、むンタヌフェむスは非垞に限定的です。 たた、Pythonのような蚀語では、察照的に非垞に䞀般的です。 遞択するむンタヌフェヌスのタむプは、䜜成される技術的負債の芏暡ずプログラマヌの生産性に圱響を䞎える可胜性がありたす。 これを蚈算する方法を以䞋に説明したす。 異なるむンタヌフェむスを評䟡および比范する方法も提案されたす。 これらの比范に基づいお、蚀語ツヌルたたは゜フトりェアツヌルの䜿甚方法を自分で芳察できたす。

゜フトりェア開発で最も重芁な抂念は、 むンタヌフェむスの抂念です。 この蚘事はJavaのむンタヌフェヌスに぀いおではなく、゜フトりェア蚭蚈のむンタヌフェヌスに぀いおです。 そしお、それほどではありたせんが、私たちを取り巻く䞖界のむンタヌフェヌスに぀いおです。 もちろん、他の倚くの重芁な抂念が゜フトりェア開発で䜿甚されおいたすが、それらのほずんどは䜕らかの圢でむンタヌフェヌスの重芁性に䟝存しおいるず思いたす。

むンタヌフェむスずは䜕ですか


私たちのほずんどは、2぀の簡単な公匏に粟通しおいたす。

むンタヌフェむスは、システムず倖郚環境の間の契玄です。
むンタヌフェヌスは、システムず倖郚環境ずのむンタヌフェヌスです。

= ∩



共圹定矩は、システムが物理オブゞェクトである堎合に最適です。 䞡方の定矩は非垞に抜象的なので、次のように入力しお芋おみたしょう。



ここでは、システムはラップトップであり、環境は手ですキヌボヌドに登る猫の足も同様です。 したがっお、むンタヌフェむスは、手ずラップトップの間の盞互䜜甚の䞀郚である必芁がありたす。これは、䞀方だけに起因するものではなく、䞡方にのみ起因するものです。 通垞、手ずキヌボヌドを別々に考えるため、この堎合のむンタヌフェむスの正確な境界は哲孊的な議論の問題です。 指ずキヌが接觊したずきに、キヌボヌドが党䜓ずしお機胜するか、個々の原子が盞互䜜甚するかを決定するのはあなた次第です。

この䟋がむンタヌフェヌスのコントラクトずしおの定矩にどのように関係するか驚くでしょう。 この堎合、合意ずは、キヌの䜍眮を芚えお筋肉の蚘憶を発達させたずきに十分な時間を費やしたずいう合意を意味したす。 倚くのニュアンスが契玄に関連しおいたす。 たずえば、キヌを抌したたたにするこずは、単玔な1回抌すこずずは異なる意味を持ちたす。

これはすべお奇劙な哲孊的掚論ですが、゜フトりェアの䜜成ずどのように関係しおいたすか たあ、そもそも泚意を払わなくおも、プログラミングむンタヌフェむスはあらゆる偎面からあなたを取り囲んでいたす。 たずえば、Javaでプログラムする堎合、目的に応じお明瀺的にむンタヌフェむスに名前を付けたす。 たた、他の蚀語では、それらも存圚したす。 add_numbers関数add_numbers䟋を芋おみたしょう。

 unsigned int add_numbers(unsigned int, unsigned int); void other_function(void){ add_numbers(3,4); } unsigned int add_numbers(unsigned int a, unsigned int b){ return a + b; } int main(void){ add_numbers(9,99); return 0; } 

環境、 add_numbersシステム、およびむンタヌフェむスを蚘述するために、 ズボンの色を区別する同じ方法を適甚したす。









ここで説明する「システム」は、 add_numbers関数で構成されおadd_numbersたす。 mainメ゜ッドother_function別のシステムず芋なすこずができるず蚀うなら、あなたは正しいでしょう。 ただし、簡単にするために、 add_numbers関数add_numbers分離されたシステムでadd_numbersず考えおいたす。 たた、むンタヌフェむスの䞀郚ずしおadd_numbersを考慮するこずをお勧めしたす。

ご芧のずおり、ここに4番目の抂念「実装」が远加されおいたす。 特定の実装を考慮せずにむンタヌフェヌスのトピックを議論するこずはかなり困難です。 この甚語を定矩したしょう

実装は、システムを陀いたむンタヌフェヌスです。

Implementation = System ∖ Interface
Implementation = System ∖ (System ∩ Environment)



私はそのような実装の定矩に出䌚ったこずがなかったこずを認めなければなりたせん。 しかし、これは、䞀連のむンタヌフェヌス定矩の避けられない拡匵であり、いく぀かの利点がありたす。 あなたが貧しい孊生で、詊隓の準備をしおいる堎合、先生はおそらくそのような定矩を聞いたこずがないでしょう。 オブゞェクト指向プログラミングの分類法ず矛盟する堎合でも、私は驚かないでしょう。 しかし、この堎合でも、倉曎する぀もりはありたせん。 私の定矩に埓っお、OOPファンにメモを曞き盎させおください。

次に、物理システムのむンタヌフェヌスに぀いお話すずき、通垞、このシステムの「実装」を単䞀の物理オブゞェクトずしお想像したす。 結局のずころ、ボタン、ディスプレむ、たたはその他のコンポヌネントを考慮せずに「実際の」実装を怜蚎するのは奇劙です。 そしお、これはむンタヌフェヌスを物理的なオブゞェクトのセットずいうよりもむしろ「合意」ずしお考えるように私たちを抌し進めたす。 ぀たり、䞀連の玄束、保蚌、たたは䜕かのような圢で... システムず環境の間の合意 。

契玄ずしおのむンタヌフェヌス


add_numbers関数のむンタヌフェヌスをadd_numbersの圢で考えるず、保蚌は次のようになりたす。


この関数のむンタヌフェヌスは䜕も䌝えたせん


䞊蚘のadd_numbersむンタヌフェむスは、 prototype関数ずしお知られおいたす。 KR Cの以前のバヌゞョンでは、より匱い圢匏のむンタヌフェむス蚘述が䜿甚されおいたした。

unsigned int add_numbers();

むンタヌフェむスをコントラクトずしお定矩するず、プログラミングに非垞に䟿利です。 結局のずころ、ほずんどのプログラマヌのタスクは、公理のセットを定矩および照䌚するこずにありたす。 初期条件ず最終条件は、いく぀かのプロパティたたは動䜜を提䟛したす。 䞡圓事者は、互いにビゞネス関係を確立する前に、契玄を䜜成したす。 最終結果、金額、支払い条件を定匏化したす。 早期終了、払い戻し、費甚の条件も事前に合意されおいたす。 契玄に違反した堎合、状況は裁刀所たたは仲裁によっお解決されたす。 しかし、契玄で䜕かを瀺すのを忘れるず、驚きが生じるかもしれたせん。

コンピュヌタヌプログラムでは、すべおが同じです。 モゞュヌルず関数は、必芁なものず堎合によっおは返すものを返したす。 この契玄に違反するず、コンパむル゚ラヌ、ランタむム゚ラヌ、アプリケヌション、システム、コヌド品質管理ツヌルの障害、および管理者からの懲戒凊分に぀ながりたす。 コントラクトずしおのむンタヌフェむスの定矩は比ical的ではないずさえ蚀えたす。 それほど詳现ではありたせんが、商業契玄ず同じ原則を䜿甚しおいたす。

特蚱、著䜜暩、むンタヌフェヌス


法的助蚀はいたしたせん。 おそらく私が蚀ったこずのいく぀かは、法埋ず矛盟するこずさえありたす。 以䞋はすべお、著者の個人的な意芋です。

そのため、むンタヌフェむスを文字通り 2぀の゚ンティティ間の「商業契玄」ず芋なす傟向がありたす。 私は匷調したす-これを比thisずは考えたせん。 私は特にこの解釈をコンピュヌタヌ科孊者ず著䜜暩擁護者に向けおいたす。

むンタヌフェむスの特蚱を取埗する必芁がありたすか システムず環境の間の契玄ずしおの定矩を考えるず、特蚱の䜿甚は間違いだず思いたす。 そしお、明らかに、既存の刀䟋法は私の立堎を支持しおいたす。 しかし、「むンタヌフェむス」ずいう蚀葉は非垞に広く䜿甚されおおり、䞊で説明したような意味ではたったく䜿甚されないこずが倚いこずに留意しおください。

むンタヌフェむスは著䜜暩で保護されるべきですか 繰り返したすが、「契玄䞊の」性質を考えるず、著䜜暩の察象はむンタヌフェヌスの「゜ヌスコヌド」でなければならないず思いたす。 同時に、著䜜暩は、むンタヌフェヌスを特別なものにするむンタヌフェヌスの偎面には適甚すべきではありたせん。 ゜ヌスコヌドたたは手曞きの画像を保護するのに十分ですが、保蚌たたは制限はありたせん。 むンタヌフェヌスの保蚌たたは制限がそのコヌドのどの郚分ずも切り離せない堎合、これらの郚分は保護の暩利を奪われるべきです。

䜕かを著䜜暩で保護する必芁があるかどうかを評䟡する簡単なテストを提案したす。

むンタヌフェむスで䜕らかの方法で䜿甚される、サヌドパヌティのコンポヌネントを含む属性のセットを保護する堎合は、い぀でも適切な代替を䜜成できたす。 亀換品は同じむンタヌフェヌスを実装し、この゜フトりェアを倉曎するこずなく、著䜜暩を䟵害するこずなく、サヌドパヌティの゜フトりェアで正垞に䜿甚されたす。 眮換が著䜜暩䟵害に぀ながる堎合、たたはサヌドパヌティからの゜フトりェアの倉曎を意味する堎合、たたは機胜を損なう堎合、属性セットは攻撃的すぎるため、削枛する必芁がありたす。

このテストの助けを借りお、特蚱性もチェックするこずをお勧めしたす。 泚テストの目的は、著䜜暩たたは特蚱保護の䞍適切性を刀断するこずのみです。 䜕を保護すべきかを決定する助けにはなりたせん。 さらに、このテストは単なる私の意芋であり、芏範的な行為や法埋ではありたせん。

たた、ある蚀語のむンタヌフェヌスの䞀郚ず芋なされる基準は、別の蚀語ではそうではないこずにも泚意しおください。 たずえば、Javaでは、関数が宣蚀される順序はプログラムの実行に圱響したせん。 たた、ファむル内の関数の順序が重芁ではないず誀っお蚀った堎合、これはPythonのプログラムに関連する゚ラヌになりたす。

 def foo(): print("asdf") def foo(abc): print(abc) foo("lol") 

この法埋に関するすべおの話は、Googleに察するOracleの蚎蚟を思い出させたした 。 提䟛されおいるリンクで開発者にずっお興味深い詳现を芋぀けるこずができるので、分析ではそれらに䟝存したす。 すべおの偎面を考えるず、オラクルを支持する決定に反察する理由はないず思いたす。 手続きの詳现がそれほど倚くないので、無条件に支持するずは蚀えたせん。

むンタヌフェヌスの芁玠を特蚱や著䜜暩で保護するための先䟋が䜜られるのではないかず倚くの人が心配しおいたず思いたす。 私のテストに合栌しなかった堎合にのみ。 地方裁刀所は、「APIの構造、䞀貫性、およびアヌキテクチャは著䜜暩によっお保護されおいる可胜性がありたす。」 これは問題ではないず思いたす。「構造、シヌケンス、およびアヌキテクチャ」の定矩自䜓が、私のテストに完党に合栌するからです。 䞊蚘のリンクの蚘事からの抜粋をいく぀か玹介したす。

「地裁は、「Javaずやり取りする広告を曞く方法は1぀しかない」ず結論付けたした。 その堎合、耇補広告の䜿甚は著䜜暩保護の察象にはなりたせん。 Googleは、3぀の䟋倖を陀いお、Javaにアクセスするための独自のAPIを䜜成できるずいう事実に異議を唱えたせん。 そしお最埌に、「Googleは文字通り広告をコピヌしたこずを認めたした。」

裁刀所は正しい刀断を䞋し、本質的に䞀意のむンタヌフェむスプロパティは保護すべきではないず結論付けたず思いたす。 さらに、Googleは「逐語的」コピヌを認識したした。 これがコピヌアンドペヌストを意味し、すべおのスペヌスずコメントのスペルミスを含む堎合、私はこれを暩利の䟵害ず芋なしたす。 むンタヌフェヌスを保護できない堎合でも、個々の創造的な衚珟の保護を劚げるこずはありたせん。

この蚎蚟に぀いおはオヌプンネットワヌクの゜ヌスからしか知りたせんが、明らかに、Googleはむンタヌフェむスを含むJava゜ヌスコヌドを完党にコピヌしたした。 これは、2010幎以前にSunずのラむセンス契玄に関する亀枉の䞻題であったため、Javaの䜿甚をラむセンスする必芁があるず圌ら自身が考えおいたようです。 しかし、SunがOracleに買収された埌、これらの契玄は倱敗したした。 それにもかかわらず、グヌグルはコヌドの「逐語的」コピヌを䜿い続けたが、それは明らかに圌女が裁刀で利益を埗なかった。 私は圌らの匁護士が自分の立堎の匱さを知っおいたのではないかず思うので、圌らはむンタヌフェヌスの著䜜暩の䞍拡散の法的芁件に基づいた防衛戊略を遞んだ。 圌らは、゜ヌスコヌドの圢でむンタヌフェヌスを提瀺し、それをより哲孊的な抂念ず組み合わせるこずで、このケヌスで勝぀こずを望んでいたした。

「モゞュヌル」たたは「抜象化」ずは䜕ですか


私の頭の䞭の「モゞュヌル」ずいう蚀葉には、投皿のタむトル画像がありたす。 この図は、モゞュヌルの境界の重芁性ず環境ずの盞互䜜甚を瀺しおいたす。 キュヌブむンタヌフェむスは、環境ずキュヌブのコンテンツずの盞互䜜甚を厳しく制限したす。 むンタヌフェヌスをバむパスするこずはできないため、むンタヌフェヌスによっお課される「ゲヌムのルヌル」を遵守する必芁がありたす。 最埌に、キュヌブ内には䜕もありたせんが、重芁ではありたせん。重芁なのはコンテンツではなく、むンタヌフェヌスです。

別の䟋现胞膜の構造。 さたざたなコンポヌネントにより、必芁な堎合にのみ、必須物質のみが膜を通過したす。



この蚘事では、「モゞュヌル」ず「抜象化」ずいう甚語を同矩語ずしお䜿甚したす。 もちろん、説明蟞曞は私ずは䞀臎したせん。たた、異なるプログラミング蚀語であっおも、これらの甚語の意味は異なりたす。 しかし、この堎合、この蚘事で理解されおいるように、これらの゚ンティティの䞡方がシステムず芋なされるずいう事実にのみ興味がありたす。 ぀たり、抜象化ずモゞュヌルは、むンタヌフェむスず実装で構成できたす。

単䞀の関数をCのモゞュヌル、Pythonの「モゞュヌル」、Javaのクラスたたはパッケヌゞず芋なすこずができたす。 倖郚むンタヌフェヌスず「隠された」実装を備えおいる堎合のみ。 さらに、「ステルス」は、蚀語のルヌルやプログラマヌの決定の結果である堎合がありたす。

挏れやすい抜象化


私の知る限り、 挏れやすい抜象化のアむデアはJoel Spolskyによっお提唱されたした 。 圌の゚ッセむにはいく぀かの良い䟋がありたすが、私は自分の䟋を挙げたいず思いたす。 プログラミングでは、「マップ」の抂念は非垞に䞀般的です。キヌず倀のペアで構成されるデヌタ構造の衚珟です。 重芁な制限カヌドは、すべおのキヌが䞀意でなければならないこずを保蚌したす。 既存のキヌに新しい倀を曞き蟌もうずするず、゚ラヌが発生するか、以前の倀が䞊曞きされたす。 䞀番䞋の行は、キヌを耇補しないこずです。 ほずんどの堎合、プログラマはこれらすべおのキヌを゜ヌトする必芁がありたす。 たた、カヌドはキヌの䞊べ替えの特定の順序を保蚌できないため、繰り返し凊理した埌はどの順序になるのか疑問に思うこずがありたすか これは、カヌドむンタヌフェむスが䞊べ替えを保蚌しないずいう事実の結果です。 そしお、それは問題ではないず信じられおいたすが、実際にはそれを敎理したいです。 これは、たずえば既存のキヌの怜蚌を容易にするために、より効率的なデヌタ線成に必芁です。

゜ヌトされたデヌタを列挙するず、ランダムデヌタを列挙する堎合ずはたったく異なる結果が埗られたす。 リストで最小倀を芋぀ける必芁があるずしたしょう

 min = null; list = map.getMapKeys(); for (item in list){ if ( min == null ){ min = item }else if (item < min){ min = min; /* This line has a bug */ } } 

デヌタが昇順で゜ヌトされおいる堎合、 else ifブランチは実行されたせん。 リスト内のランダムな堎所からチェックを開始しおも、プログラムはこの行に出くわすこずはありたせん。 そしお、これは倧きな問題です。なぜなら、カヌドの実装を倉曎し、゜ヌトされたキヌを返さないず、バグが発生しおブランチでコヌドの実行が突然開始されるからです。 そしおその時たでに、あなたはこのコヌドずその䞭に隠された爆匟を完党に忘れるでしょう。

抜象リヌクの独自の定矩を提䟛したいず思いたす。

抜象化リヌクは、実装がむンタヌフェむスによっお提䟛されなかった方法で環境に圱響を䞎える可胜性がある状況です。

この定矩によれば、 ほずんどすべおの抜象化は挏れやすいです。 実際、あらゆるタむプの環境圱響のむンタヌフェヌスでの蚘述は、最も厳密な数孊的システムでのみ意味がありたす。 物理システムに぀いおは、 ゲヌデルの䞍完党性定理を思い出しおください。

ほずんどの抜象化における挏れの考えは根拠のないものではありたせん。 ゞョ゚ル・スポルスキヌはたた、圌の挏れのある抜象化の法則でこれを暗瀺しおいたす。

「すべおの非自明な抜象化は、ある皋床挏れやすい。」

すべおの抜象化には穎がたくさんあるので、䜕に぀いお話せたすか 問題が発生するのは、環境の䞀郚が、環境䞊のシステムに圱響を䞎える予期せぬ方法の1぀に䟝存し始めたずきだけです。 誰もがそのような挏れに぀いお話しおいる。

これは、通垞のバグだけでなく、セキュリティの分野でも、広範囲に及ぶ結果をもたらしたす。 セキュリティを損なう倖郚環境ぞのリヌクがある物理システムでは、「 サヌドパヌティのチャネルを介した攻撃 」ずいう甚語が関連付けられおいたす。 すべおの抜象化には挏れがあるずいう声明ず合わせお、これが結論に぀ながりたす。

暗号システムの各物理実装は、サヌドパヌティのチャネルを介した攻撃に察しお脆匱です。

䞊蚘のすべおを考慮するず、このアむデアは物理的だけでなく、゚ミュレヌトされた実装にも拡匵できたす。

むンタヌフェむスの評䟡ず比范


䞊で芋たように、戻り倀の型や関数に枡すこずができるパラメヌタヌの数など、Cむンタヌフェヌスで蚭定されたす。 Pythonはどうですか 私は、蚘事の文脈に埓っお「むンタヌフェヌス」ずいう甚語を䜿甚したす。぀たり、Pythonの「むンタヌフェヌス」に関する本に曞かれおいるものよりも広い意味で䜿甚したす。

 def add_numbers(a,b): return a + b print(add_numbers(3,1)) print(add_numbers("abc","def")) 

この蚀語では、関数むンタヌフェむスタむプを圢匏化する必芁がありたす。 これにより、凊理する必芁のある情報が少なくなるため、関数の定矩ず呌び出しが簡単になりたす。 䞀方、時間の経過ずずもに゚ラヌを芋぀けるためにチェックできる制限は少なくなりたす。

情報転送方法の芳点から、むンタヌフェヌスのさたざたな特性を評䟡および比范するこずに぀いお、䜕か蚀わなければならないこずがあるず思いたす。 特定のむンタヌフェむスず、この蚀語で実装できるすべおのむンタヌフェむスの党䜓の䞡方を評䟡できたす。 add_numbers䟋を思い出しお、抜象リヌクを䜿甚しおむンタヌフェむスを通過およびバむパスできる情報量を評䟡しおみたしょう。

むンタヌフェむス経由むンタヌフェヌスのバむパス
機胜の説明可胜な状態の数機胜の説明可胜な状態の数
パラメヌタタむプ11笊号なし敎数グロヌバル倉数状態グロヌバル倉数の数*グロヌバル倉数の状態の数
パラメヌタタむプ21笊号なし敎数ファむルシステムファむルシステムの状態の数
戻りタむプ1笊号なし敎数CPU䜿甚時間制限なし
パラメヌタヌ1倀2 ^笊号なし敎数のビット数ヒヌプ状態ヒヌプ状態
パラメヌタ2倀2 ^笊号なし敎数のビット数他の倚くの......
戻り倀2 ^笊号なし敎数のビット数

たた、Pythonむンタヌフェヌスを介しおadd_numbers通信できるものがいく぀かありたす。

Pythonむンタヌフェむスを介した情報の受け枡しPythonむンタヌフェヌスをバむパスしお情報を枡す
機胜の説明可胜な状態の数-
1-
2
-
1...
2...(- ) * (- )

, Haskell:

 add_numbers :: Int > Int -> Int add_numbers 3 4 = 7 main = print (add_numbers 3 4) 


, add_numbers :

HaskellHaskell
--
11 (Int)
21 (Int)/
1 (Int)......
11 ( 3)
21 ( 4)
2^30[ 1 ]

:


:


, :

画像

GUIGUI
--
1- , 1 * -UI
2- , 2 * -- , 2
1- , 1UI...
2- , 2
-
, GUI- , GUI

cd :

GUIGUI
--
- ,

, . ( ) ( ), , . . , «OK» «Cancel» 1 .

, .

, . :



. :

(leaky interface) — , .

(specific interface) — .


— - , .

«» «» , , , — .



, - , , . : . .

, , . «» , - . , .


:

- , - , .

- , (1). , (1), . (N^2). , , , N^2.



, . - , . - , . — , , .

, (N^2), , (N). , : . 20 , , , , . , . , , — .

?


, :


, , ! . 100 , , GUI. GUI, - , , . 
 .

, , . , . , . GUI . , . , .

, , GUI — . , . , . , , .


, , Haskell Java. , . .

?

« », , . , , , , « ».

« », , : . — , , . , MVP . , , .

« », . , . , - ( ).

- , Twitter Ruby on Rails, . Twitter Scala. - , Scala. . Twitter' , . , . , , , . – , . Twitter' , . , , , : « , , ». - , , , . , «» , .

Python?


, , . , «» «» , .

, Python , , . Python .

Python . , .

Java/C++?


, . Java ++ , Python Ruby. , , ( Haskell), Java ++ , . , . , , .


- , : , . , ! , , :


おわりに


ご芧のように、むンタヌフェむスの抂念は非垞に重芁であり、法的保護、生産性、およびシステム構造の他の偎面ずの哲孊的぀ながりの数の分野でプロゞェクトの開発に非垞に倧きな圱響を䞎えたす。他のプログラマヌにむンタヌフェヌスに぀いおどう思うか尋ね、あらゆる皮類のものを聞いおください。

Source: https://habr.com/ru/post/J278561/


All Articles