Кіріспе
Бағдарламалық жасақтама үлгісі
Model–view–controller (MVC) is a software design pattern commonly used for developing user interfaces that divides the related program logic into three interconnected elements. These elements are:
the model, the internal representations of information
the view, the interface that presents information to and accepts it from the user
the controller, the software linking the two. Traditionally used for desktop graphical user interfaces (GUIs), this pattern became popular for designing web applications. Popular programming languages have MVC frameworks that facilitate the implementation of the pattern. TOC
Model–view–controller (MVC) – пайдаланушы интерфейстерін жасау үшін жиі қолданылатын бағдарламалық жасақтама үлгісі. Ол өзара байланысты үш құрамдық бөлікке жинақталған бағдарламалық логиканы бөліп көрсетеді. Бұл құрамдық бөліктер:
Model–view–controller (MVC) is a software design pattern commonly used for developing user interfaces that divides the related program logic into three interconnected elements. These elements are:
the model, the internal representations of information
the view, the interface that presents information to and accepts it from the user
the controller, the software linking the two. Traditionally used for desktop graphical user interfaces (GUIs), this pattern became popular for designing web applications. Popular programming languages have MVC frameworks that facilitate the implementation of the pattern. TOC
модель – ақпараттың ішкі көрінісі;
көрініс – ақпаратты пайдаланушыға ұсынатын және одан ақпаратты қабылдайтын интерфейс;
контроллер – осы екеуін байланыстыратын бағдарламалық құрал. Бұл үлгі бастапқыда десктоптық графикалық пайдаланушы интерфейстерінде (GUI) қолданылса, кейіннен веб-қосымшаларды жобалауда кең таралды. Көптеген бағдарламалау тілдерінде MVC үлгісін енгізуді жеңілдететін фреймворктер бар. Мазмұны
Model–view–controller (MVC) is a software design pattern commonly used for developing user interfaces that divides the related program logic into three interconnected elements. These elements are:
the model, the internal representations of information
the view, the interface that presents information to and accepts it from the user
the controller, the software linking the two. Traditionally used for desktop graphical user interfaces (GUIs), this pattern became popular for designing web applications. Popular programming languages have MVC frameworks that facilitate the implementation of the pattern. TOC
Тарих
Графикалық пайдаланушы интерфейстерін дамытудың алғашқы кезеңдеріндегі маңызды жаңалықтардың бірі – MVC, бағдарламалық құралдарды олардың жауапкершіліктері тұрғысынан сипаттау және жүзеге асырудың алғашқы тәсілдерінің бірі болды. Тригве Ринскауг MVC-ді 1970-ші жылдардың соңында Xerox Palo Alto Research Center (PARC) ғылыми орталығында Smalltalk 79-мен жұмыс істеген кезінде жасады. Ол пайдаланушылардың үлкен, күрделі деректер жиынтығымен өзара әрекеттесетін кез келген бағдарламаны құру үшін қолданылатын үлгі іздеді. Оның бастапқы дизайны төрт бөліктен тұрды: Модель, көрініс, нысан және редактор. Басқа Smalltalk әзірлеушілерімен талқылағаннан кейін, ол және топтың қалған бөлігі Модель, көрініс және контроллерге тоқтасты. 1988 жылы The Journal of Object Technology (JOT) журналында екі бұрынғы PARC қызметкері жариялаған мақаласында MVC Smalltalk 80 әзірлеушілері үшін жалпы «бағдарламалау парадигмасы және әдістемесі» ретінде ұсынылды. Алайда, олардың схемасы Ринскауг және авторлардың схемасынан, сондай-ақ Smalltalk 80 анықтамалық кітаптарында келтірілген схемадан өзгеше болды. Олар көріністі кез келген графикалық мәселені қамтитын ретінде анықтады, ал контроллер – пайдаланушының енгізген деректерін қабылдайтын және бір немесе бірнеше көріністермен және тек бір модельмен өзара әрекеттесетін абстрактілі, көбінесе көрінбейтін нысан болды. MVC үлгісі кейіннен дамып, MVC-ді әртүрлі жағдайларға бейімдеген иерархиялық модель-көрініс-контроллер (HMVC), модель-көрініс-адаптер (MVA), модель-көрініс-презентер (MVP), модель-көрініс-көрініс модель (MVVM) және басқа да нұсқаларға жол ашты. 1996 жылы NeXT компаниясының WebObjects енгізілуінен кейін веб-қосымшаларда MVC үлгісін қолдану өсті, ол бастапқыда Objective C тілінде жазылған (Smalltalk-тен көп нәрсені қарыз алған) және MVC принциптерін сақтауға көмектесті. Кейіннен MVC үлгісі Java әзірлеушілері арасында танымал болды, өйткені WebObjects Java-ға көшірілді. Java үшін жасалған кейінгі фреймворктер, мысалы Spring (2002 жылдың қазанында шығарылды), Java мен MVC арасындағы тығыз байланысты сақтап қалды. 2003 жылы Мартин Фаулер «Patterns of Enterprise Application Architecture» кітабын жариялады, онда MVC «кіріс контроллері» сұранысты қабылдайтын, модель нысанына тиісті хабарламаларды жіберетін, модель нысанынан жауап алатын және жауапты көрсету үшін тиісті көрініске жіберетін үлгі ретінде ұсынылды. Бұл Ruby on Rails веб-қосымшалар фреймворкіне (2004 жылдың тамызы) ұқсас, онда клиент серверге сұрауларды браузер көрінісі арқылы жібереді, бұл сұрауларды сервердегі контроллер өңдейді, ал контроллер тиісті модель нысандарымен байланысады. Django фреймворкі (Python үшін 2005 жылдың шілдесі) осыған ұқсас «модель-үлгі-көрініс» (MTV) тәсілін ұсынды, онда көрініс модельдерден деректерді алады және оларды көрсету үшін үлгілерге жібереді. Rails және Django екеуі де жылдам енгізуге баса назар аударды, бұл MVC-нің дәстүрлі кәсіпорын ортасынан тыс танымалдығын арттырды.
Үлгі
Үлгінің орталық компоненті. Бұл қолданбаның динамикалық дерек құрылымы, ол пайдаланушы интерфейсінен тәуелсіз. Ол қолданбаның деректерін, логикасын және ережелерін тікелей басқарады. Smalltalk 80-де модель түрінің дизайны бағдарламашының толық ықтиярында. WebObjects, Rails және Django жүйелерінде модель түрі әдетте қолданбаның дерекқорындағы кестеге сәйкес келеді.
Көрінісі
Ақпаратты кез келген түрде көрсету, мысалы, диаграмма, сызба немесе кесте. Бірдей ақпаратты әртүрлі көріністерде ұсыну мүмкін, мысалы, басшылар үшін жол диаграммасы және бухгалтерлер үшін кестелік көрініс. Smalltalk 80-де көрініс – модельдің визуальды бейнесі ғана, ол пайдаланушының енгізген мәліметтерімен жұмыс істемейді. WebObjects-те көрініс мәзір немесе батырма сияқты толыққанды пайдаланушы интерфейсі элементін білдіреді және пайдаланушыдан мәліметтерді қабылдайды. Дегенмен, Smalltalk 80 және WebObjects жүйелерінде көріністер жалпы мақсатта қолданылады және бір-бірімен құрастырылуы мүмкін. Rails және Django-да көрініс рөлін HTML үлгілері атқарады, сондықтан олардың жүйесінде көрініс тікелей пайдаланушы интерфейсі элементін көрсетудің орнына браузердегі пайдаланушы интерфейсін анықтайды. (Django осыған байланысты осы нысанды "үлгі" деп атауды жөн көреді.) Бұл тәсіл кішкентай, құрастырылатын көріністерге салыстырмалы түрде аз мән береді; әдеттегі Rails көрінісі контроллер әрекетімен бір-бірге сәйкес келеді. Smalltalk 80 көріністері модельмен де, контроллермен де байланысады, ал WebObjects-те көрініс тек контроллермен байланысады, ол өз кезегінде модельмен байланысады. Rails және Django-да контроллер/көрініс клиентке жауап дайындағанда көрініс/үлгіні пайдаланады.
Бақылаушы
Кірісті қабылдайды және оны модель немесе көрініс үшін командаларға айналдырады. Smalltalk 80 контроллері пайдаланушының кнопкаларды басу немесе тышқанның қозғалысы сияқты кіріс оқиғаларын басқарады. Кез келген уақытта әрбір контроллерде бір байланысты көрініс және модель болады, бірақ бір модель объектісі көптеген түрлі контроллерлерден хабар алуы мүмкін. Кез келген уақытта тек бір контроллер, "белсенді" контроллер ғана пайдаланушыдан кіріс алады; жаһандық терезе менеджері объектісі ағымдағы белсенді контроллерді орнатуға жауапты. Егер пайдаланушының кірісі модельде өзгерістерді тудырса, контроллер модельге өзгеріс жасауға сигнал береді, бірақ модель өзінің көріністерін жаңартуға жауапты болады. WebObjects жүйесінде көріністер пайдаланушының кірісімен айналысады, ал контроллер көріністер мен модельдер арасында делдалдық қызмет атқарады. Бір қолданбаға немесе бір терезеге тек бір контроллер ғана болуы мүмкін. Қолданбаға тән логиканың көп бөлігі контроллерде кездеседі. Rails жүйесінде клиенттен сервердегі қосымшаға келіп түскен сұраулар "маршрутизаторға" жіберіледі, ол сұрауды белгілі бір контроллердің белгілі бір әдісіне бағыттайды. Бұл әдіс шеңберінде контроллер сұрау деректерімен және кез келген тиісті модель объектілерімен өзара әрекеттеседі және көрініс арқылы жауап дайындайды. Әдетте, әрбір көріністің оған байланысты контроллері болады; мысалы, егер қолданбада клиент көрінісі болса, онда әдетте оған байланысты Клиенттер контроллері де болады. Дегенмен, әзірлеушілер қаласа, басқа да контроллерлерді жасауға құқылы. Django осы рөлді атқаратын объектіні контроллер емес, "көрініс" деп атайды.
Мотивация
Алан Кей 2003 жылы жазғандай, MVC-нің бастапқы мақсаты кез келген объекті үшін графикалық интерфейс жасауға мүмкіндік беру еді. Бұл туралы Ричард Паусонның "Жылаңаш объектілер" кітабында толыққанды түсіндірілген.
Веб-қосымшаларда пайдалану
Бастапқыда үстелдік есептеулер үшін жасалғанмен, MVC негізгі бағдарламалау тілдеріндегі World Wide Web қолданбалары үшін кеңінен қабылданды. Осы үлгіні сақтау үшін бірнеше веб-фреймворк құрылды. Бұл бағдарламалық қамтамалардың түсіндірулері әртүрлі, негізінен MVC жауапкершіліктері клиент пен сервер арасында қалай бөлінеді дегенде. MVC-нің алғашқы фреймворктері серверде модельдің, көріністің және контроллердің барлық логикасын орналастыратын жұқа клиенттік тәсілді қолданды. Бұл тәсілде клиент контроллерге гиперсілтеме сұраныстарын немесе формаларды жібереді, содан кейін көріністен толық және жаңартылған веб-бетті (немесе басқа құжатты) алады; модель толығымен серверде сақталады. Кейінгі фреймворктер MVC компоненттерінің бір бөлігін клиентте орындауға мүмкіндік берді, деректерді синхрондау үшін Ajax пайдаланды.