「フラットな」オブゞェクトモデルたたは「シンタックスシュガヌ」の䟡倀

過去15〜20幎で、信じられないほどの数の新しいプログラミング蚀語が登堎したした。 それらの倚くは、「真の」オブゞェクト指向蚀語、たたは少なくずもオブゞェクト指向プログラミングOOPをサポヌトする蚀語ずしお提瀺されおいたす。 いずれにせよ、これらの蚀語では、オブゞェクト指向の方法論に埓っお開発を行うこずが可胜であるこずが特に匷調されおいたす。 プログラミング蚀語がOOP蚀語であるためには、 オブゞェクトモデルを実装する必芁がありたす。 OOPがプログラミングの圢匏から抂念ず方法論により近いものに倉わったずいう事実により、異なる蚀語は倚かれ少なかれ同じオブゞェクトモデルに準拠し始めたした。 しかし、さらに、これらの蚀語はさたざたな構文構造で倧きくなりすぎおおり、その䞀郚はいわゆる「構文シュガヌ」ず呌ばれ、オブゞェクトに察しお頻繁に実行されるアクションをよりコンパクトに実行できたす。

ほずんどのプログラミング蚀語ではオブゞェクトモデルが非垞に耇雑であるため、「フラットな」 オブゞェクトモデルの蚘述を定矩しお、可胜な限り削陀したす。



  1. 「オブゞェクト」タむプの終端蚘号甚語が定矩されおいたす。 「タむプの終端蚘号」オブゞェクト「」ずいう衚珟は、蚀語レベルで衚珟されたこの甚語に察しお特別な語圙構成が利甚可胜であるこずのみを意味し、割り圓おずメ゜ッド呌び出しの2぀のみを考慮したす。
  2. 終端蚘号「オブゞェクト」の倀は、いく぀かの゚ンティティぞの参照です。その説明に぀いおは、次の段萜で説明したす。
  3. 操䜜「=」が定矩されおいたす-参照による割り圓お。 1぀の終端蚘号 term1 を別の終端蚘号 term2 に割り圓おるこずは、甚語term1からterm2に同じ゚ンティティぞのリンクをコピヌするこずを意味したす。
  4. 甚語の意味である゚ンティティには、いく぀かのメ゜ッドがありたす。 メ゜ッドが呌び出され、字句構造「。」を䜿甚しおパラメヌタヌが枡されたす。 および「」、぀たりterm.method(param1, param2)



    。
  5. ゚ンティティには、状態を構成する他の゚ンティティの順序付けられおいないセットがありたす。
  6. 特定のメ゜ッドセットず特定の初期状態で他の゚ンティティを䜜成できる゚ンティティが少なくずも1぀ありたす。
  7. 1぀の゚ンティティから別の゚ンティティに状態ずメ゜ッドのセットをコピヌできる゚ンティティが少なくずも1぀ありたす。
  8. コピヌp。7䞭のメ゜ッドず状態芁玠は、コピヌ先の゚ンティティに同じ名前の同じものが存圚する堎合、眮き換えられたせん。


その説明がパラグラフ1〜8で䞎えられおいるオブゞェクトモデルには、「フラットオブゞェクトモデル」ずいう名前が付けられおいたす。

䞀般的に、䞊蚘で定矩されたモデルは倧幅に簡玠化されおいたす。たずえば、デフォルトでは基本型からの継承は考慮されおおらず、各オブゞェクトでサポヌトされおいる継承メカニズムさえありたせん-このため、このアクションを他の゚ンティティで実行できる定矩枈み゚ンティティが1぀あるず想定されおいたす。

偶数オブゞェクトモデルは、オブゞェクト指向をサポヌトする蚀語を呌び出すのに十分です。 OOPの特性評䟡でよく蚀及される甚語は、それぞれ4、5、6、および7、8項で考慮されるカプセル化、継承、およびポリモヌフィズムです。 8。 私はすぐに、この蚀語のオブゞェクトモデルに䟝存せず、オブゞェクトの操䜜に関連しない他の目的のために䞀般的なケヌスで意図されおいる蚀語の手段は、 ハックず芋なされないずいう事実に泚意を喚起したいず思いたす 。 たずえば、C ++コンパむラの䞊に構築されたObjective-Cコンパむラの実装を怜蚎する堎合、メむンのObjective-Cオブゞェクトモデルのハッキングを怜蚎する際に、C ++オブゞェクトモデルは考慮されたせん。 少し前に登堎した蚀語を含め、䞀郚の蚀語がどのようにハッキングで倧きくなりすぎたか、およびこれらのハックがどれほど成功したかに぀いお簡単に説明したしょう。



ハッキングなし



確かに、プログラムを矎しく明確に曞くこずがすでに可胜になっおいるずきにハックが必芁な理由、さらに、そのような蚀語のむンタヌプリタヌは、解釈する必芁のある远加の構文構造がないずいう事実のために、コンパむルの点でよりシンプルで高速であるこずが刀明したした。 䞊蚘のフラットオブゞェクトモデルは、最小限の構文構造割り圓おずメ゜ッド呌び出しを前提ずしおいたす。フラットオブゞェクトモデルを操䜜するための構造を陀く、他の構造を含たないクリヌンなオブゞェクト指向蚀語を䜜成するず、非垞にシンプルになりたす。 Smalltalkオブゞェクトモデルに非垞に近い。 フラットオブゞェクトモデル甚に指定された2぀の構文構造-割り圓おずメ゜ッド呌び出しメッセヌゞの送信がありたすが、いく぀かのハックもありたす。 たず、文字通り特別なオブゞェクト-ブロック、配列、文​​字を䜜成する方法がありたす。 しかし、これらは非垞にきちんずした䟿利なハックであり、䜕もする必芁はありたせん。 もう1぀、Smalltalkにはメタモデルがありたす。 奇劙なこずに、Smalltalkは子䟛たちがプログラミングできるこずを期埅しお䜜成されたしたが、経隓豊富なプログラマでさえSmalltalkメタモデルを理解するこずはほずんどできたせん。 Smalltalkにはクラスがあり、クラスは明瀺的なハックであり、オブゞェクト指向モデルはクラスなしで実行できたす。 ただし、Smalltalkの堎合、クラスずメタクラスはどちらも、特にポむント7ず8のタスクを解決するグロヌバルオブゞェクトであるため、Smalltalkのハックは非垞に巧劙で゜フトで、ほずんど誰もいないため、ほずんどハックではありたせん。苊情が発生したす。

たずえば、通垞の意味でのコンストラクタヌはありたせん;サブクラスが䜜成されたずきに継承される新しいメ゜ッドがありたす。 ただし、継承のための特別な構造もありたせん。継承元のクラスにサブクラスメッセヌゞを送信するだけです。 たた、クラスは、次のすべおの機胜を備えた単玔なグロヌバルオブゞェクトです。



 Object subclass: #Person instanceVariableNames: 'Family Name ' ...
      
      







぀たり、オブゞェクトの管理の耇雑さ党䜓は、蚀語の構文レベルではなく、メタモデルのレベルで衚されたす。メタモデル自䜓は、すべおのルヌルによっお、蚀語のオブゞェクトモデルに刻たれおいたす。

Selfは、フラットオブゞェクトモデルに非垞に近く、メ゜ッド呌び出しメッセヌゞの送信に眮き換えられる割り圓お操䜜さえないため、この意味で、䞊蚘で怜蚎したフラットオブゞェクトモデルよりもさらにクリヌンです。



必芁に応じおカヌキ



倚くのプログラミング蚀語で長い間登堎しおきた叀いハックは、クラス、静的メンバヌ、パブリック、プラむベヌト、保護されたメンバヌ、コンストラクタヌ、デストラクタです。 これらは非垞に銎染みのあるものなので、少数の人控えめに蚀っおも、「少数の人」はそれらをハックずしお分類したす。 しかし、実際には、これらのものがプログラミングに持ち蟌たれ、さらに簡単ではなく、より芖芚的になりたした。 さらに、クラスのない静的に型付けされた蚀語では、同時にオブゞェクトの型を構成するため、管理が非垞に困難です。 静的に型付けされた蚀語は、率盎に蚀っお、OOPにずっお理想的な環境ではありたせんが。 䞀般に、これらは非垞に適切なものであり、別のこずは驚くべきこずです。動的に型付けされた蚀語にどれほど簡単に定着したかです。 そしお、この傟向は、たずえばCoffeeScriptでも続いおいたす。 JavaScriptでよく行われるように、オブゞェクトは論理的なハッシュテヌブルです。倖郚ではオブゞェクトは単なる順序付けられおいないプロパティずメ゜ッドのセットであるため、継承ずポリモヌフィズムを远加するだけであり、JavaScriptで非垞に成功しおいたす。 䞀般に、プロトタむプベヌスの蚀語はフラットなオブゞェクトモデルに非垞に近く、JavaScriptはこれをよく瀺しおいたす。 しかし、JavaScriptのような成功した蚀語に基づいお別の蚀語CoffeeScript、クラスを䜜成するこずは、䌝統ぞの賛蟞のように芋えたすが、このアプロヌチは䞀郚の人にずっおはより銎染みのあるものです。



クラスず静的メンバヌがオブゞェクトモデルのハックである理由に぀いお、もう少し考えおみたしょう。 実際、クラスは他のオブゞェクトを䜜成するグロヌバルオブゞェクトずしお機胜したす。 しかし同時に、クラスはオブゞェクトモデルC ++、Javaの範囲を超えおいたすが、クラスがオブゞェクトモデルのフレヌムワヌク内にあり、オブゞェクト自䜓Smalltalk、Pythonがある堎合もありたす。 クラスがない堎合、同じ目的でグロヌバルオブゞェクトを䜿甚できるこずがわかりたす。 倚くの人は、おそらく倉数のようなグロヌバルオブゞェクトが悪いず蚀うでしょう。 グロヌバル倉数は悪いですが、クラスずの違いがないため、クラスを眮き換える蚀語のグロヌバルオブゞェクトはそうではありたせん。 それどころか、クラスではグロヌバルオブゞェクトよりも耇雑になるこずがありたす。 䟋ずしおJavaを取り䞊げたす。 Javaむンタヌプリタヌがそのようなクラスがあるこずを「蚘憶」し、その静的郚分を初期化するには、 Class.forName("** ")



を蚘述する必芁がありたす。぀たり、クラスは環境に認識されおいるようですが、実際には衚瀺する必芁がありたす明らかに圌は䜕です。

したがっお、静的メンバヌは、このようなグロヌバルオブゞェクトの通垞の非静的メンバヌずしお簡単に䜜成するこずもできたす。 しかし、繰り返したすが、これらのタむプのハッキングは非垞に正垞であり、少なくずも倧倚数の開発者に認識されおいたす。



ゞェネリックは、共通ロゞックを共有するクラスを䜜成する際に静的に型付けされた蚀語の制限のいく぀かを克服できるため、匷制的で成功したハックに起因する可胜性もありたす。 しかし、Genericsが型キャストの単なる眮換であり、コンパむル段階での互換性をチェックする堎合、C ++テンプレヌトは別の話です。おそらくこれは静的メタプログラミングを可胜にするオブゞェクトモデルの最も匷力なハックの1぀であり、明らかに優れおいたす...䜿い方を知っおいたす。



非垞に興味深い点は、ある蚀語のオブゞェクトモデルの制玄がどのように別の蚀語に移行したかです。 PHPには、Javaモデルず構文的に非垞に類䌌したオブゞェクトモデルがありたす。 すべおうたくいきたすが、それらの間には1぀の小さな違いがありたす。Javaは静的に型付けされた蚀語であり、PHPは動的です。 PHPには、関数に枡す匕数の型を指定するようなものがありたす。 しかし、JavaずPHPでは構文的には同じように芋えたすが、これらの蚀語は異なるタむプのタむプを持っおいるため、この匕数のタむプの衚瀺はたったく異なる圹割を果たしたす。 Javaでは、コンパむル時に匕数をどう凊理するかをコンパむラに指瀺し、PHPでは、Reflectionを䜿甚したす。぀たり、匕数にそのようなスヌパヌタむプがあるこずを実行時チェックしたす。



きちんずしたハック



もちろん、たず最初に、きちんずしたハックのカテゎリに、オヌバヌラむド/オヌバヌロヌド挔算子を含めたいず思いたす。 これはもはや匷制的なハックではなく、オブゞェクトモデルの非垞に䟿利な拡匵機胜です。 すべおの挔算子のオヌバヌロヌドはメ゜ッド呌び出しによっお完党に明確に眮き換えるこずができたすが、その䜿甚のおかげで、コヌドはより自然で衚珟力豊かになりたす。 これらの皮類の機胜は、オブゞェクトモデルの拡匵の成功に起因する堎合もありたす。



匷力なハック



もちろん、最も匷力なハッキングの1぀はロックです。 カレヌは、閉鎖の有無にかかわらず行うこずができたす。 䞀般に、関数型プログラミングFPは最高レベルのプログラマヌの所有物ではなくなり、䜿い慣れた蚀語になりたした。 しかし、問題はFPが䞀般的な蚀語だけでなく、OOPが既に操䜜しおいる蚀語にもなったこずであり、これは䞀般に少し異なりたす。 AFがOOPを移動できなかったこずは明らかであるため、AFは䞊からOOPの䞊に暪たわる以倖に遞択肢がありたせんでした良い意味で、そうでないず蚀う方法がわかりたせん。 倖向きに、構文的には、クロヌゞャヌはクヌルに芋えたすが、FPは本圓に「正盎に」機胜しおいるようです。 しかし、賢明な刀断で、FPは、たずえばオブゞェクトがクラスから関数やモゞュヌルに至るたですべおを占めおいたPythonで、どのように正盎に機胜するのでしょうか 正しく、いずれにせよ、動䜜するのはOPではなく、これらすべおのラッパヌ、ラムダ、デコレヌタがむンタヌプリタヌによっお倉換されるOOPです。 ぀たり、FPの䞖界からのこれらのロヌションはすべお、OOPに察する定期的なハッキングにすぎないこずがわかりたす。 それらは䜕に倉換されたすか Cなどの非垞に特殊化されたオブゞェクト、スヌパヌタむプDelegate



を持぀オブゞェクト。 これらのオブゞェクトは、本質的にクロヌゞャヌが実装される1぀のメ゜ッドのみを再定矩したす。 しかし、代理人がいない堎合はどうでしょうか Cに぀いお話すず、Javaで可胜なように、呚囲のオブゞェクトのコンテキストにロックする可胜性のある非静的な内郚クラスがないため、この堎合は少しストレスがありたす。 ただし、倧惚事にはなりたせん。デリゲヌトオブゞェクトを明瀺的に䜜成するずきに、拡匵可胜なオブゞェクトぞのリンクを枡すだけで枈みたす。



 class SomeContext { public int number { private set; get; } public SomeContext(int initialNumber) { number = initialNumber; } public Addition addition { get { return new Addition(this); } } public class Addition { //      Addition public Addition(SomeContext context) { _contest = context; } public void add(int number) { _contest.number += number; //   private-,      } private SomeContext _contest; } } class Program { static void Main(string[] args) { SomeContext context = new SomeContext(9); SomeContext.Addition addToContext = context.addition; //      addToContext.add(6); Console.WriteLine(context.number); } }
      
      







もちろん、デリゲヌトを䜿甚するず、これはより簡単になりたす。



 class SomeContext { public int number { private set; get; } public SomeContext(int initialNumber) { number = initialNumber; } public Addition addition { get { return delegate(int what) { number += what; }; } } public delegate void Addition(int number); } class Program { static void Main(string[] args) { SomeContext context = new SomeContext(9); SomeContext.Addition addToContext = context.addition; // external delegate logic addToContext(6); Console.WriteLine(context.number); } }
      
      







どちらの堎合でも、別個のロゞックが割り圓おられおいるオブゞェクト Addition



型のオブゞェクトは、 SomeContext



型の拡匵可胜なオブゞェクトの内郚コンテキストに察しお閉じられおいるこずがSomeContext



たす。 そしお、割り圓おられたロゞックは非垞に重芁であり、このロゞックの凊理は別のオブゞェクトに委任されたす。 ただし、これら2぀の゜リュヌションの最初の方法には、存圚する堎合、その状態を遞択したオブゞェクトに保存できるずいう利点があり、2番目の堎合、状態を保存せずにDelegate型のオブゞェクトが䜜成されたす。぀たり、デリゲヌトの呌び出し間では、珟圚の状態は保存されたせん。 ラムダ匏を䜿甚しおさらに簡朔に蚘述するこずもできたすが、今ではそれに぀いおではありたせん。 クロヌゞャヌはそれほど匷力なものではありたせんが、単玔なケヌスでは非垞に簡朔に芋える堎合がありたす。



ハックのハック



均䞀なオブゞェクトモデルのハックは䟿利で䟿利です。 しかし、堎合によっおはそれらの倚くがあり、印象はそれらがもはや管理可胜ではないずいうこずです。 確かに最もハッキングされたC蚀語の1぀。 クリ゚むタヌはこの蚀語に可胜なすべおを抌し蟌みたいず思っおいたようで、さらに同じこずを耇数回抌し蟌もうずしたようです。 特に、これにより、たずえば、同じコヌルバック構成を定矩する4぀の異なる方法がありたす。 䜕かがやり過ぎだず思われたす...しかし、これらの構造はすべお蚀語の構文を䜿甚するため、それをオヌバヌロヌドしたす。 たた、Microsoftの瀟員がC蚀語オブゞェクトモデルをハッキングするこずを決定したこずに぀いお、他にも倚くの奇劙な点がありたす。



  1. 2぀のタむプのオブゞェクト-参照ず倀による。 それらの間の明瀺的暗黙的遷移パッキング/アンパッキング。 「倀による」オブゞェクトは、フラットだけでなく、ある皋床銎染みのあるオブゞェクトモデルにずっおもあたり特城的ではありたせん。 そしお、これは、「倀による」を含むすべおのオブゞェクトが、参照であるオブゞェクトを継承するずいう事実にもかかわらずです。 奇劙ですね。
  2. 非仮想メ゜ッド。 䞀般的に蚀えば、非仮想メ゜ッドは無効化されたポリモヌフィズムです。぀たり、ルヌルから抜け出すための方法であり、よく知られおいるオブゞェクトモデルの方法です。 しかし、これはただ最も奇劙なこずではありたせん。 非仮想メ゜ッドを持぀クラスは、むンタヌフェヌスを実装できたす。 ぀たり、第1レベルでは、むンタヌフェむスから非仮想メ゜ッドを䜿甚する実装クラスに移行するず、ポリモヌフィズム自䜓がこの第1レベルで機胜し、その埌停止したす。
  3. メ゜ッドをnew



    ずしお宣蚀するこずにより、倚盞関係を継承階局の任意のレベルで停止できたす。
  4. 定矩䞊、仮想関数を含めるこずができない構造䜓は、むンタヌフェむスを実装できたす。 構造では、非垞に興味深いこずがわかりたした。 構造は倀型であり、むンタヌフェヌスはオブゞェクト参照型です。 SomeStructure



    構造䜓がSomeInterface



    むンタヌフェむスを実装するSomeInterface



    たす。 SomeStructure



    型のむンスタンス構造の既補のむンスタンスがありたす。 倉数SomeInterface anObject = instance



    。 質問に泚意しおくださいanObjectはむンスタンス構造のむンスタンスを倀たたは参照で参照したすか むンタヌフェヌスはオブゞェクト参照タむプですが、倀によっお刀明したす。 ぀たり、この割り圓おでは、構造むンスタンスのコピヌが䜜成され、参照により存圚したす。 前もっおこれを知らなければ、どこかで捕たるこずができたす。




もちろん、これらのすべおのハッキングは重芁ではありたせん。少なくずもCでは、ハッキングされたモデルのサブセットずしお倚少なりずも通垞のオブゞェクトモデルがあり、通垞のモデルに固執するこずができたす。



結論



掗緎された構文は、必ずしもアプリケヌションロゞックの実装においお本圓に玠晎らしい機䌚を提䟛するずは限りたせん。 ほずんどの堎合、「垞に」ず蚀わない限り、あらゆる皮類の「構文的なお菓子」をオブゞェクトの通垞の挿入に眮き換えるこずができ、オブゞェクトモデルのフレヌムワヌク内であっおも、読みにくいコヌドや構造の悪いコヌドを䜿わずに耇雑なものを曞くこずができたす。 さらに蚀えば、かなり単玔なオブゞェクトモデルを自由に䜿甚でき、 銀色の匟䞞にずらわれない恐ろしい獣に優雅か぀単玔に察凊できたす。たずえば、2぀のフラグメントを比范するずきにわかるように、自明でないロゞックを実装する自由床がさらにありたすCコヌド。新しいクラスずデリゲヌトに基づいた゜リュヌションを䜿甚したす。 ゜リュヌションがクラスに基づいおいる堎合、ロゞックがレンダリングされるオブゞェクトデリゲヌトの呌び出し間で状態を維持できたす。

匕き出せるもう1぀の結論は、オブゞェクトモデルの機胜は、メタモデルに入れるず向䞊する可胜性がありたすが、蚀語の構文のレベルでは存圚しないずいうこずです。 Smalltalkメタモデルは䟋ずしお提䟛されたした。 この堎合、以䞋の機胜が埗られたすが、構文が「乱雑」になりたせん。 しかし、実際には、逆の傟向が最近芳察されおいたす-プログラミング蚀語は構文の耇雑さを増す方向に開発されおおりC、CoffeScript、Scala、玔粋なオブゞェクトモデルを備えた蚀語は埐々に忘华に向かっおいたす。 たずえば、自己開発は完党に䞭止され、Smalltalkはかろうじお生きおいたす。



All Articles