OOP、IP、FP、ハノむタワヌ

これは、OOP、FPの倧きな違いを説明するための詊みです。
関数型プログラミングおよびPI必須およびPIの理由を蚌明する
問題を解決するずきの奜たしい考え方です。
ハノむの塔の問題を解決する䟋を䜿甚しお、これらすべおを実行しようずしたす。
圓然、私は経隓豊富なオブゞェクト指向、F、たたはIず呌ばれるふりをしたせん
プログラマヌですが、ただいく぀かのスキルがあり、それらを詊しおみたす
このタスクに適甚されたすが、私の考えのコヌスは可胜性が最も高く、さらに、
さらに、特に建蚭的な批刀をする必芁があるので、
真実に到達したす。


たず、問題の本質は䜕かを思い出させおください。 最初に3本のロッドが䞎えられたした1、2、3-オン
そのうちの1぀は、半埄が異なるN個の円の砲塔に匵られおおり、
倧きい半埄は垞に小さい半埄の円です。 プログラムは
これらの円をロッドからロッドに移動しお、砲塔が
別のロッドになっおしたいたした。 同時に、各シフトは保存する必芁がありたす
円の順序-すべおの円は、より倧きな円にのみ配眮できたす
半埄、たたは空のロッドで、あなたはほずんどの1぀だけをシフトできたす
棒の䞊の円。
そのため、最初に1本の棒の䞊に2぀の円の高さがある砲塔を䞎えた堎合、
ロッド番号2に転送する必芁がある堎合は、正しい
シヌケンス
移動は次のようになりたす1-> 3、1-> 2、3-> 2.ルヌルではN-> M
ロッド番号のみが䜿甚され、以䞋を瀺したす。
ロッドNからロッドMぞの円
機胜的アプロヌチ。 それは叀兞を䞎えるので、最初に考慮
問題に察する「孊校」の解決策。
関数を䜜成する必芁がありたす。

  N abcを移動 

関数。タレットの高さ、最初のロッドa、最埌のロッドb
さらにcを抌すず、移動のリストが衚瀺されたす。 うヌん...たあ、他の䜕から
機胜を調理できたすか 他からいく぀かの関数をコンパむルするこずが本質です
アプロヌチ。 機胜を考え出すこずができたす

  movetoken ab 

ある棒から別の棒に円を移動したすが、意味がありたせん
それを呌び出す方法が明確ではないためです。 少し必芁
玠晎らしい機胜コンセプトで脳を瞑想し、陰圱を぀けたす
最初の䟋を芋お、砲塔を動かすには、たず
䞊郚を補助ロッドに移動し、䞋の円を
タヌゲット、そしお同じロッドでタレットの䞊郚を移動したす。 同時に
䞊の円はどのロッドにも移動できたす。なぜなら、
それらの䞋では、半埄が倧きくなりたす。
やったヌ 挑戊する
解決したした。 関数moveが䜕を返さなければならないかを理解するだけです。
原因に。 しかし、ここではすべおが単玔であり、FPは代替手段を提䟛したせん。 だから
ビゞネス。 実装は倧ざっぱで、Haskellで蚘述できるものに䌌おいたす。

 N abcを移動
 // 1぀の円をタヌゲットの砲塔に移動したす
移動1 abc =a、b
 // topをrod cに転送、倧きな円をrod bに転送、
 //ロッドcからロッドbにトップを移動したす
移動N abc =移動N-1acba、b移動N-1cba

 //さお、このようなものを呌び出したす
印刷移動16 1 3 2 

゚レガントで挑戊的。
しかし、今ではオブゞェクト指向のアプロヌチです。 最初に匷調する必芁がありたす
オブゞェクト。 さお、これは簡単です。マグカップずロッド、そしお砲塔そのものです。
䜕らかのオブゞェクトにメッセヌゞを送信するずいう圢の゜リュヌションが必芁です。 䜕か
のような。

  tower.movea、b、c 

玠晎らしい。 砲塔、マグカップ、ロッドがありたす。 そしお、それをすべおたずめる方法
メッセヌゞの送信を通じお うヌん...埌頭郚に敬意を払い、䞀般的なロッドからそれを決める
圌女だけでは問題ないので、1぀のチップからも無駄です。
圱響したす。 砲塔に集䞭し、カボチャを傷぀けお、それを蚀うこずは残っおいたす
砲塔は、2぀のオブゞェクトで構成されおいたす䞊郚、
砲塔たたは欠萜しおいる、およびベヌスの倧きな円です。 玠晎らしい。
このようにオブゞェクトを構築する堎合、゜リュヌションは再び明癜です。 砲塔を尋ねる
補助を䜿甚しお別のロッドにゞャンプし、圌女は
最初に補助ロッドの䞊郚にゞャンプするように芁求し、次に
ベヌスをタヌゲットロッドに移動し、ゞャンプするように芁求する
このタヌゲットロッドはその先端です。 さお、今床はいく぀かのクラスをロヌルしたす。
すべおが回路図であり、Javaに䌌おいたす。 すべおのメ゜ッドはオヌプンであり、デヌタはプラむベヌトです。

クラスタワヌ{
 // a-これは砲塔が立぀ロッドで、チェックに䟿利です
 //タレットが1にある堎合、たずえばmove1、3などの無効なリク゚スト
 //ピボット。  FIGはどのリク゚ストが来るかを知っおいるため、信頌性が高く、
 //カプセル化。 しかし、コヌドにはチェックがありたせん。
         int N、a;
        タワヌトップ。

        タワヌN、䜍眮{
                 N> 1の堎合{
                         top =新しいタワヌN-1、a;
                 }
                その他{
                         top = null;
                 }

                 this.N = N;
                 this.a = a;
         }

        リスト移動b、c{// b-移動先、c-補助ロッド
                リストl;

                トップ{
                         l.appendtop.movec、b;
                 }

                 l.appenda.toString + "->" + b.toString;

                トップ{
                         l.appendtop.moveb、a;
                 }

                 a = b;  //新しいロッドに移動したした

                 return l;
         }
 }

 //起動
 System.out.printnew TowerN、1。Move2、3.toString;

うわヌ、それはクヌルでした。 圌らは優雅さを倱いたしたが、私たちはクヌルです
゚ラヌをチェックできるオブゞェクトがカプセル化され、
䞀般的に、すべおずおもかわいい。 疑わしい呜什的アプロヌチ
さらに優雅さをマヌゞし、レンズはきれいになりたせんので、
圌は図で、理論的に。 しかし、私たちは歯を食いしばっお突砎したす。
それでは、呜什型アプロヌチには䜕がありたすか なし機胜もオブゞェクトもありたせん。
メモリの特定の領域の状態ずこれらの倉曎の説明がない限り
状態。 この状態では、各ディスクに円のリストを䜜成できたす。
うヌん...あたり楜芳的ではありたせん。 さお、リストずリストが、それらをどうするか うヌん...
リスト。 亀響詩、゚りレカ、私たちはただいく぀かの動きのリストを持っおいたすが、どれですか
たずえば、砲塔を2円高く移動するための移動のリストがありたす。
2番目から3番目の1番目のロッド1-> 2、1-> 3、3-> 2。
玠晎らしい。 それで䜕ができたすか たずえば、列番号を眮き換えたす。
たずえば、次のようになりたす。1= 1、2 = 3、3 =2。そしお、プログラムを取埗しお、
2番目のコアの2぀の円の蟲堎1-> 3、1-> 2、3-> 2。
私は䜕を埗おいたすか
今、2レベルの経枈を2番目の経枈に移行するためのプログラムがあれば
列、3番目に3番目に倧きいパンケヌキを配眮できたす。
次に、すでによく知られおいる2ファヌムの転送プログラムを䜿甚しお、
1番目のロッドを2番目から3番目に眮き換え、その䞭に眮換を䜜成したす。
1 = 2、3 = 1、2 = 3、2番目のロッドからの転送プログラムを取埗したす
3番目から最初。 そしお、最終的に私たちは玠晎らしいプログラムの所有者になりたす
3番目のロッドを最初のロッドから3番目のロッドに転送したす。 などなど。

このようなプログラムの開発を開始する方法を理解するこずだけが残っおいたす。 でも
これは明らかです。タレットの高さが奇数の堎合、最初の移動が必芁です。
タヌゲットロッド、それ以倖の堎合は補助。 曞かれた゜リュヌション
iscriptに䌌たもの。

 nextblockcmdnew、cmdold、f{
         a = f [0];  //珟圚のプログラムはaからbからcたでの順列です
         b = f [1];  //䞊䜍N個の円
         c = f [2];

         //N + 1円をaからcに移動したす
         listappendcmdnew、{.from = a; .to = b;};

         f [0] = b;  // aを介しおbからcぞの順列を生成したす
         f [1] = c;
         f [2] = a;

         i = cmdold.head; 私に;  i = i.next {
                 listappendcmdnew、{.from = f [i.from]; .to = f [i.to];};
         }

         f [0] = a;  //これで、aからcにbたでの順列ができたした
         f [1] = c;  //N + 1-ファヌム
         f [2] = b;
 }

 solveN、a、b、c{
         f [0] = a;
         N2の堎合{
                 f [1] = b;
                 f [2] = c; 

         }
        たたは{
                 f [1] = c;
                 f [2] = b;
         }

         Nで;  N = N-1 {
                 nextblockfl、sl、f;
                
                 i = fl.head; 私に;  i = i.next {
                         print "0->0 \ n"、i.from、i.to;
                 } 

                 listmovesl、fl;  //すべおを最初のリストから2番目のリストに移動したす
         }
 }

 solve16、2、0、1;

ふむ FPたたはOOPのオプションよりも長くなりたす。 しかし、このコヌドずそれらを比范したしょう
2぀のオプションがあり、それらは互いに類䌌しおいるず芋なすこずができたす。 あなたができる泚意
いく぀かの機胜を掻甚したす。
たず、プログラムの生成はすぐに開始され、長時間埅぀必芁はありたせん
再垰が終了するたでの時間。これで十分かもしれたせん
長い間、動きのタスクの耇雑さは指数関数的に増倧したす。 䞀方、有名な
移動は、さらに䞊列凊理するために送信できたす。たずえば、
このたさにハノむのゲヌムの芖芚化プログラム。
第二に、呜什型コヌドは無限のピラミッドで動䜜するこずができたす。
通垞、最初のNを決定する堎合を陀いお、Nは実際には必芁ありたせん。
移動したす。
2぀の再垰構造ではこれを行えたせん。 うヌん...少し哲孊的
䜙談倚分これは、再垰的な構造では䞍可胜だからです。
最初の動きずの䞍確実性。 再垰は垞に定矩する必芁がありたす。 でも
これは将来の分析のための発蚀です。
最埌に、個人的に私私は匷調したす個人的に、最埌の手段の真実に぀いお
私はふりをしたせん䞊蚘の掚論は
プログラミングアプロヌチ。
プログラムは正確に動的システムず芋なされる必芁がありたす。぀たり、
状態倉化によっお蚘述されるシステム。
やっおみるず
次のように、静的マッピングの圢匏で機胜を定匏化する
関数型プログラミング、私たちは自分自身を制限するこずを䜙儀なくされおいたす
1.ダむナミクスでは、関数の倀を蚈算する必芁があるため、
私たちはそれを䜿うこずができたす
2.効率ず分垃蚈算倀が朜圚的に
完党な蚈算が完了する前に䜿甚でき、その埌
叀兞的なFP、これを行う方法はありたせん。
もちろん、これらの問題の解決策が芋぀かっおいたす。MLには次の機胜がありたす。
呜什型プログラム、Haskellには動的呜什型のモナドがありたす
蚈算は、倀の無限リストをマップしたす
このダむナミクスの軌跡は、最も䟿利な解決策ではありたせん。
プログラムを盞互䜜甚するものずしお芋ようずするずき
特別なむンタヌフェむス、オブゞェクト、そしお再びダむナミズムを倱いたす。 なぜなら
盎感的な衚珟のオブゞェクトは、たったくないプロセスに察応しおいたす。
すべおの動的構造ではありたせん。 この䟋では、自然
画像もちろん、私の意芋では、倚くの教科曞によっおバックアップされおいたす
OOPでは、同様のタスク、たずえば玄8フレヌズがこの方法で正確に解決されたす、
オブゞェクトが遞択されたしたタレット。 そしお、そのような抜象化が䜕に぀ながるのかを芋る-
再垰アルゎリズムの即時構築、それが意味するすべおのこず
欠点。
もちろん、暗黙的なOOPの堎合、ビゞュアラむザヌのデヌタ生成
再垰が最初の底に達するずすぐに開始できたすが、
非垞に長い時間それに到達したす。 FIの䞀郚ずしお、これも行うこずができたすが、やや
より玛らわしい。 さらに、私たちはそうではないこずを忘れおはなりたせん
そのように遞択されたオブゞェクトのシステムでは、無限の砲塔で問題を解決できたす。
OOPずFIがプログラマの胜力を制限するためです
タスクのダむナミクスを参照しおください、個人的に、私はデザむンでそれらを䜿甚するこずはありたせん。
プログラム内でのデヌタの流れ方ずその方法に焊点を圓おたす
私の意芋では、これはより矎しくシンプルになりたす
決定。 䞖界はダむナミックだからです
存圚しないため、オブゞェクトたたは機胜よりも物理的珟実に近い
オブゞェクト、本質的に機胜なし。 動的システムのみが詊行されたす
珟代の物理孊を私たちに蚌明しおください。 なぜあなたの心を制限する
FPである珟実の静的モデルに焊点を圓おる
おっず 数孊的性質によるFP、およびその理由によるOOP
近代的な圢は受動的ずの類掚に関する意識を修正する
マテリアルオブゞェクト。
公平に蚀うず、この䟋では、オブゞェクトは
䞀連の動きを遞択し、同様の呜什型゜リュヌションを構築する
プログラム、しかしOOプログラマヌは、明癜なオブゞェクトの怜玢から始たり、ではなく
蚭蚈機胜を制限するダむナミクスの分析、
そしお、これはしばしば圌に圌らのより類䌌した決定に぀ながりたす
FP䞊の構造。 FPアプロヌチのフレヌムワヌクでは、これは朜圚的に
行うこずはできたすが、はるかに難しく、無限の砲塔を数えるこずができたす
のフレヌムワヌク内で完党に遅延実行される関数型蚀語でのみ
ただし、ラムダ抜象化の堎合、このような蚈算は蚈算できたせん。 たた、ずころで、
コンピュヌタヌはチュヌリングマシン以䞊のものであるこずを蚌明しおいたす。
さらに、プログラミング蚀語は同様の蚭蚈に傟いおいたすが、
自分をオブゞェクト指向ず呌ぶ人。 それらのオブゞェクトは
ダむナミック゚ンティティはメッセヌゞを亀換したす。
Smalltalk、぀たり静的
抜象デヌタ型、これ以䞊。 独自の動的オブゞェクト
人生、それを䜜成するこずは非垞に困難です。 分散しおいおも抵抗する
テクノロゞヌ、同じCROBA、
リク゚ストに応じおのみオブゞェクトが生き返りたす。
実装個別のスレッドの起動、およびむンタヌフェヌスを䜿甚した共有デヌタぞのアクセス
同期を䜿甚したす。 これは、本栌的なクラむアントサヌバヌの䜜成です
出おくるアプリケヌション。 しかし、OOPは再びプロセスずしおではなく䜜成する傟向がありたす。
しかし、䞀連のオブゞェクトの圢で、再び死んで動的ではないこずが刀明したした
そのコアで。 それらの間の実際のデヌタフロヌを敎理するこずは困難です。
䞊行しお実行するこずは困難です。これは、再床実行する必芁があるためです。
サヌバヌ。
その間、玔粋に機胜的な゜リュヌションずしお始たったいく぀かの蚀語は
最終的に進化しお、たさにそのような゚ンティティを䜜成する機胜を提䟛したした
-メッセヌゞングプロセス。 ErlangずO'Caml、䟋ですが、これは
可胜性は、これらのほが機胜的な機胜に基づいおいたす
蚀語状態を保存するモナドたたは明瀺的な胜力。 きれいに
これによる呜什的な構造的アプロヌチはたったく発生したせん。
Limbo、Ada、たたはUNIX䞊のIPCなど。
実際、アピヌルはこれに基づいおいたす私だけでなく、
http://www.lysator.liu.se/c/pikestyle.htmlOOPずFIをどこでも拒吊
デヌタ倉曎の分析のみに焊点を圓おお
プログラム、状態プロパティ、および倉曎のロゞック。
別の
䜙談珟代の物理孊は既存のものを考慮し、それは盎感的です
泚目するこずなく、倉化の過皋で特性を保存するこずは明らかです
プログラム内のダむナミクスの分析では、保存されたプロパティを正確に識別できたせん。
したがっお、オブゞェクト。 このような分析は、より柔軟な゜リュヌションずより効果的な゜リュヌションに぀ながりたす。
むンタヌフェヌス、関数、モゞュヌル、クラスはプロセスで自然に発生したす
プログラムの実装。 そしお、それらは再利甚できたす。

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


All Articles