Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MVC. Контроллеры (http://www.flasher.ru/forum/showthread.php?t=202510)

AlexCooper 20.07.2013 14:35

MVC. Контроллеры
 
Здравствуйте.
Решил попробывать написать проект и использованием MVC-модели. Если я все правильно понял, Модель - это хранилище данных, ссылки которые раздаются вьюверам.
Вьюверы в свою очередь обновляют данные когда изменились данные в модели.
Контроллер - это механизм который создает вьюверы, модели, а так же осуществляет создание связей между ними.

Знаю что глобальный класс должен передавать в главный контроллер ссылку на себя и все но у меня пока немного не так. Пока создаю модель без вьюверов, хочу пройти сначало по моделям с контроллерами.

основной класс
Код AS3:

package  {
 
        import flash.display.Sprite;
 
        import me.inpictures.worker.Framework;
        import me.inpictures.worker.Auth;
        import me.inpictures.worker.amf.AMF
 
        public class InPictures extends Sprite {
 
                private var framework:Framework = new Framework();
 
                public function InPictures() {
 
                        new AMF('http://dev.net/app/Amfphp/');
 
                        framework.addTask(new Auth());
                        framework.run();
                }
        }
}

framework
Код AS3:

package me.inpictures.worker {
 
        import flash.events.Event;
 
        public class Framework {
 
                private var _autorun:Boolean;
 
                private var _task:Vector.<Worker>;
 
                public function Framework(autorun:Boolean = true) {
 
                        _autorun = autorun;
 
                        _task = new Vector.<Worker>;
                }
 
                public function addTask(worker:Worker):void {
                        _task.push(worker);
                }
 
                public function run():void {
 
                        if (_task.length) {
 
                                var task:Worker = _task.pop();
                                        task.addEventListener(Event.COMPLETE, taskCompleteHandler );
                                        task.run();
                        } else trace('Framework: TaskComplete');
                }
 
                private function taskCompleteHandler(event:Event):void {
 
                        event.currentTarget.removeEventListener(Event.COMPLETE, taskCompleteHandler );
 
                        if (_autorun) run();
                }
        }
}

Вот здесь возникает первый вопрос. При выполнении контроллера Auth у нас приходят данные от сервера, и если в данных содержится переменная "registration" значит нужно провести регистрацию пользователя, то-есть запустить отдельный контроллер. Как это правильно реализовать? Создать модель на подобии "центральной" модели приложения, где при выполнении контроллера Auth, модель приложения изменит к примеру статус и в соответствии главный контроллер удалит / создаст нужны окна или же мы из одного контроллера вызываем сразу второй? И в любом из случаев каким образом передаем нужный нам контроллер (экземпляр / константа + if ) ?
Код AS3:

package me.inpictures.worker {
 
        import flash.events.Event;
 
        import me.inpictures.data.User;
 
        import me.inpictures.worker.amf.AMF;
 
        public class Auth extends Worker {
 
                public function Auth() {
 
                }
 
                override public function run():void {
 
                        AMF.call('User/auth', authHandler, User.simple );
                }
 
                private function authHandler(data:Object):void {
 
                        if (data.registration) {
 
                                trace('registration');
                        }
 
                        dispatchEvent(new Event(Event.COMPLETE));
                }
        }
 
}

Добавлено через 26 минут
P.s. Силой святого компилятора призываю к обсуждению Babylon =)

namespaces 20.07.2013 15:28

Цитата:

Сообщение от AlexCooper (Сообщение 1141509)
Если я все правильно понял, Модель - это хранилище данных, ссылки которые раздаются вьюверам.
Вьюверы в свою очередь обновляют данные когда изменились данные в модели.
Контроллер - это механизм который создает вьюверы, модели, а так же осуществляет создание связей между ними.

Вьюверы также информируют Модель об изменении, обратная ссылка на Модель, чтобы Контроллер знал когда изменился Вьювер.

Контроллер имеет ссылку на Модель.
Модель имеет только на Вьювер.
Вьювер имеет на Модель и на Контроллер.

AlexCooper 20.07.2013 15:42

Цитата:

Сообщение от namespaces (Сообщение 1141513)
Вьюверы также информируют Модель об изменении, обратная ссылка на Модель, чтобы Контроллер знал когда изменился Вьювер.

Контроллер имеет ссылку на Модель.
Модель имеет только на Вьювер.
Вьювер имеет на Модель и на Контроллер.

хм... а в чем же тогда смысл модели? Если вьювер делает какие-то расчеты ( в нем присутствует какая-либо логика) . Вьювер вообще по сути на сколько я понял может меняться как перчатки, так же как и модель, и за все это ни как в Бригаде, отвечает только контроллер. То-есть контроллер выступает механикой приложения, вьювер только отображением ( максимум генерация событий ) а модель хранение данных для get вьювера и set контроллера.

КорДум 20.07.2013 15:49

Цитата:

Вьюверы также информируют Модель об изменении, обратная ссылка на Модель, чтобы Контроллер знал когда изменился Вьювер.
Неправда. Вьюверы диспатчат события, эти события ловят контроллеры.

2ТС, прочтите это.

AlexCooper 20.07.2013 15:54

Цитата:

Сообщение от КорДум (Сообщение 1141517)
Неправда. Вьюверы диспатчат события, эти события ловят контроллеры.

2ТС, прочтите это.

Благодарю, я это уже читал ( изучал вопрос прежде чем приступить к разработке) . Только там слишком много различных мнений, но выбрал то что и пытаюсь сейчас реализовать. Вопрос пока что стоит только в том, как из одного контроллера создавать другой. Передавать данные через модель ( и каким образом const+if или экземпляром) или создавать контроллер в контролере передавая ему нужные ссылки.

Tails 20.07.2013 15:57

Модель это не просто хранилище данных, модель - это состояние программы, которое вполне может изменяться и самостоятельно (действие гравитации в игре, нанесение урона юнитам стоящим в огненной луже, изменение индексов на онлайн бирже)

Модель описывает всю логику программы, высылает уведомления при возникновении некоторых событий. Модель имеет интерфейс для чтения/внесения изменений в свой мирок. Модель ничего не знает ни про визуализатор, ни про контроллер.

Визуализатор - подключаемый модуль для отображения модели. Он имеет ссылку на модель. Визуализаторов может быть несколько, они могут быть разными (2д, 3д) и все они сразу могут отображать одну модель. Визуализатор читает модель, слушает её события изменения, обновляет себя сам в соответствий с текущей ситуацией в отображаемой им модели. Визуализатор слушает действия пользователя и высылает их события.
Вьювер так-же имеет некоторый интерфейс, он может быть заморожен контроллером при выполнении какой-то операций.

Контроллер имеет ссылки на оба компонента. Он приостанавливает ход выполнения в модели, добавляет новых игроков на бирже, активирует дополнительные режимы. Контроллер слушает визуализатор на предмет действия пользователя, анализирует и принимает решения по изменению модели.

Имхо, на истину не претендую, так делаю сам.

AlexCooper 20.07.2013 16:10

Спасибо Tails, доходчиво написано.
То-есть по сути, модель это и есть модель со всеми вытекающими ему свойствами, может сама видоизменяться но не участвует на прямую с внешними процессами, за это отвечает контроллер.

Но остается открытым мой вопрос, контроллер получил событие создать новый контроллер, каким образом он это делает?

Tails 20.07.2013 16:15

Есть глобальная модель, для описания всех необходимых данных в своём мире, она может создавать дополнительные под-модели. Аналогично и для вьюшки с контроллером.

Вы в главном коде единожды создаёте глобальные: модель, вьювер и контроллер, а те уже сами по ходу выполнения решают, что им нужно. Главный контроллер может создать дополнительные под-контроллеры для сохранения/загрузки файла, вьювер может создавать дополнительные под-вьюверы для отображения бэграунда/юнитов и т.д.

пс. Выше стоящий контроллер должен принимать решение о смене своих детей - под-контроллеров.

КорДум 20.07.2013 16:22

Я для себя использовал иерархический MVC, То есть у меня не было обособленных трио, у меня были контроллеры с некоторым уровнем вложенности, в главном контроллере были созданы вьюшки во вьюшках; были созданы в нем же модели в моделях. То есть каждой вьюшке передаем либо какую-то модель в главной модели, либо всю модель целиком.

Добавлено через 44 секунды
Словом, выбирайте то, что вам будет удобнее. Эта штука у каждого разработчика своя.

AlexCooper 20.07.2013 16:29

Понял. Буду пробывать)
То-есть примерно так
Код AS3:

package me.inpictures.worker {
 
        import flash.events.Event;
 
        import me.inpictures.data.User;
 
        import me.inpictures.worker.amf.AMF;
 
        public class Auth extends Worker {
 
                private var _model:Model;
 
                public function Auth(model:Model) {
                        _model = model; // Ссылка на главную модель
                }
 
                override public function run():void {
 
                        AMF.call('User/auth', authHandler, User.simple );
                }
 
                private function authHandler(data:Object):void {
 
                        if (data.registration) {
 
                                // меняем в главной моделе страницу
                                _model.setPage('registration');
                                // или нужно использовать константу, если да то как?
                        }
 
                        dispatchEvent(new Event(Event.COMPLETE));
                }
        }
 
}

Добавлено через 1 минуту
Цитата:

Сообщение от КорДум (Сообщение 1141523)
Эта штука у каждого разработчика своя.

Хочется быть в тренде, что-бы не смотрели на мои разработки и думали кто написал этот *****код.

Tails 20.07.2013 16:36

AlexCooper,
Главная цель - максимальное уменьшение зависимостей в пользу лёгкой последующей модернизаций/обнавлений кода. Каждый класс должен выполнять строго отведённую ему область задач. Чем меньше он знает о том, что твориться вокруг него - тем лучше. Отлично, если он вообще не ведает что над ним и следовательно легко может быть заменен.

AlexCooper 20.07.2013 16:38

В таком случае как бы Вы видоизменили мой код?

Tails 20.07.2013 16:44

Модель, получив данные, парсит их. Видит, что есть новый не авторизованный пользователь - высылает событие NEW_USER. Отдельный под-контроллер, заранее подписанный на конкретно это событие, получает уведомление и производит необходимые действия.

До тех пор, пока контроллер не завершит обработку, новый юзер в модели числится как не авторизованный.

AlexCooper 20.07.2013 16:48

Благодарю

Babylon 20.07.2013 20:24

На самом деле удобно иметь несколько контроллеров для вида, модели и глобальный для ядра.
В глобальном лучше размещать основные команды ядра. Контроллер вида обслуживает виджеты,
а контроллер модели сервисы. Скелет вида, модели и контроллер команд, у меня естественно XML, ноды которого передаются в соответствующие конструкторы дисплей контейнеров вида , которые затем рендерятся виджетами. Соответственно вся иерархия в виде графа, который агрегатирован по parent id соответствующей xml ноды.



Нода вида
...
Нода Коллекция виджетов

.....

Нода Коллекция команд и хэндлеров
....
Нода Коллекция сервисов

AlexCooper 20.07.2013 23:20

Цитата:

Сообщение от Babylon (Сообщение 1141539)
На самом деле удобно иметь несколько контроллеров для вида, модели и глобальный для ядра.
В глобальном лучше размещать основные команды ядра. Контроллер вида обслуживает виджеты,
а контроллер модели сервисы. Скелет вида, модели и контроллер команд, у меня естественно XML, ноды которого передаются в соответствующие конструкторы дисплей контейнеров вида , которые затем рендерятся виджетами. Соответственно вся иерархия в виде графа, который агрегатирован по parent id соответствующей xml ноды.



Нода вида
...
Нода Коллекция виджетов

.....

Нода Коллекция команд и хэндлеров
....
Нода Коллекция сервисов

Имеется ввиду что вся структура программы генерируется на основании подгружаемого XML? Если да, для меня пока это будет сложно повторить но про перспективы возможности можно только догадываться )

Пока написал вот это
Код AS3:

package  {
 
        import flash.display.Sprite;
 
        import me.inpictures.Controller;
        import flash.events.Event;
 
        public class InPictures extends Sprite {
 
                public function InPictures() {
 
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event):void {
 
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        var controller:Controller = new Controller(stage,this);
                }
        }
}

Controller - главный контроллер
Код AS3:

package me.inpictures {
 
        import me.inpictures.worker.Framework;
        import me.inpictures.worker.app.Auth;
        import me.inpictures.worker.app.Registration;
        import me.inpictures.worker.amf.AMF
 
        import me.inpictures.data.User;
 
        import flash.events.Event;
 
        import flash.display.DisplayObjectContainer;
        import flash.display.Stage;
 
        import me.inpictures.worker.GetFlashVars;
        import me.inpictures.worker.api.SocialNetwork;
 
        public class Controller {
 
                private var _stage:Stage;
 
                private var _user:User;
 
                private var framework:Framework;
 
                private var _model:Model = new Model();
                private var _viewer:Viewer = new Viewer(_model);
 
                private var _container:DisplayObjectContainer;
 
                public function Controller(stage:Stage, container:DisplayObjectContainer)
                {
                        _stage = stage;
 
                        _container = container;
 
                        init();
                }
 
                private function init():void {
 
                        _container.addChild(_viewer);
 
                        _model.addEventListener(Model.PAGE_UPDATE, pageUpdate);
 
                        new AMF('http://dev.net/app/Amfphp/');
 
                        _user = new User();
 
                        framework = new Framework();
 
                        framework.addTask(new GetFlashVars(_stage,_user));
                        framework.addTask(new SocialNetwork(_user));
                        framework.addTask(new Auth(_user,_model));
                        framework.run();
                }
 
                private function pageUpdate(e:Event):void {
 
                        switch (_model.page )
                        {
                                case Model.PAGE_REGISTRATION:
 
                                        new Registration(_user,_model).run();
 
                                break;
                        }
                }
        }
}

Model - главная модель
Код AS3:

package me.inpictures {
 
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class Model extends EventDispatcher {
 
                public static var UPDATE:String = 'update';
 
                public static var PAGE_UPDATE:String = 'page_update';
 
                public static var PAGE_REGISTRATION:String = 'page_registration';
 
                private var _page:String = 'default';
 
                public function Model() {
 
                }
 
                public function get page():String {
                        return _page;
                }
 
                public function setPage(page:String):void {
 
                        _page = page;
 
                        dispatchEvent(new Event(PAGE_UPDATE));
                }
        }
}

Viewer - главный вьювер ( пока не используется, работаю пока только с данными)
Код AS3:

package me.inpictures {
        import flash.events.Event;
        import flash.display.Sprite;
 
        public class Viewer extends Sprite  {
 
                private var _model:Model;
 
                public function Viewer(model:Model) {
                        _model = model;
                        _model.addEventListener(Model.UPDATE, update );
                }
 
                private function update(e:Event):void {
                        trace('>>>update');
                }
        }       
}

User - модель пользователь ( черновая версия )
Код AS3:

package me.inpictures.data {
 
        import flash.events.EventDispatcher;
        import flash.events.Event;
 
        public class User extends EventDispatcher {
 
                public static var NEW_USER:String = 'new_user';
 
                private var _systemId:uint = 0;
                private var _uid:uint = 0;
                private var _network:String = 'unbrowse';
 
                public function User() {
                        _network = 'vk';
                }
 
                public function get sid():uint {
                        return _systemId;
                }
 
                public function get uid():uint {
                        return _uid;
                }
 
                public function sign(data:*):Object {
 
                        var send:Object = new Object();
 
                        if ( data is Object || data is Array) {
 
                                        var ind:String;
 
                                        for ( ind in data) {
                                                send[ind] = data[ind];
                                        }
 
                                        send.sign = true;
 
                        } else if (data is String) {
                                        send.string = data;
                                } else send.sign = false;
 
                        return send;
                }
 
                public function get simple():Object {
 
                        var data:Object = new Object();
                                data.uid = uid;
                                data.network = _network;
 
                        return data;
                }
 
                public function setFlashVars(data:Object):void {
 
                        if (!_uid) _uid = (data.viewer_id) ? uint(data.viewer_id) : 16580191;
 
                }
 
                public function auth(data:Object):void {
 
                        _systemId = (_systemId) ? _systemId : uint(data.uid.sys);
 
                        if (data.registration) dispatchEvent(new Event(User.NEW_USER));
 
 
                        for ( var i in data) {
                                trace( i + " >> "+data[i]);
                                for ( var ii in data[i]) {
                                        trace(' >> '+ii+' >> '+data[i][ii]);
                                }
                        }/***/
                }
 
                public function get all():Object {
 
                        var data:Object = new Object();
                                data.sys = _systemId;
                                data.uid = uid;
                                data.network = _network;
                                data.first_name = _first_name;
                                data.last_name = _last_name;
                                data.sex = _sex;
                                data.nickname = _nickname;
                                data.photo = _photo;
                                data.bday = _bday;
                                data.city = _city_id;
                                data.country = _country_id;
 
                        return data;
 
                }
 
                public function socialAuth(data:Array):void {
 
                        if (data.length && _uid == data[0].uid) {
 
                                _nickname        = data[0].first_name;
                                _sex                = data[0].sex-1;
                                _realname        = data[0].first_name+" "+data[0].last_name;
                                _first_name = data[0].first_name;
                                _last_name = data[0].last_name;
 
                                if (data[0].bdate) {
                                        if (data[0].bdate.length>0) {
                                                var r = data[0].bdate.split(".");
 
                                                r[0] = (r[0]) ? r[0] : "1";
                                                r[1] = (r[1]) ? r[1] : "1";
                                                r[2] = (r[2]) ? r[2] : "1950";
 
                                                r[0] = (r[0]<10) ? "0"+r[0] : r[0];
 
                                                r[1] = (r[1]<10) ? "0"+r[1] : r[1];
 
                                                _bday = r[2]+" "+r[1]+" "+r[0];
                                        } else _bday = "1950 01 01";
                                } else _bday = "1950 01 01";
 
                                _photo = data[0].photo_big;
 
                                _city_id = (data[0].city) ? data[0].city : 0;
                                _country_id = (data[0].country) ? data[0].country : 0;
                        }
                }
 
                private var _first_name:String = '';
                private var _last_name:String = '';
 
                private var _bday:String = '';
                private var _nickname:String = '';
                private var _sex:Number = 0;
                private var _realname:String = '';
                private var _photo:String = '';
                private var _city_id:uint = 0;
                private var _country_id:uint = 0;
 
        }
}

"Внутренние" контроллеры
Код AS3:

package me.inpictures.worker {
 
        import flash.display.Stage;
        import flash.events.Event;
        import me.inpictures.data.User;
 
        public class GetFlashVars extends Worker {
 
                public function GetFlashVars(stage:Stage, _user:User) {
 
                        _user.setFlashVars(stage.loaderInfo.parameters as Object);
 
                        dispatchEvent(new Event(Event.COMPLETE));
                }
        }       
}

Код AS3:

package me.inpictures.worker.app {
 
        import flash.events.Event;
 
        import me.inpictures.Model;
 
        import me.inpictures.data.User;
 
        import me.inpictures.worker.Worker;       
        import me.inpictures.worker.amf.AMF;
 
        public class Auth extends Worker {
 
                private var _user:User;
                private var _model:Model;
 
                public function Auth(user:User , model:Model) {
 
                        _user = user;
                        _model = model;
 
                        if (!_user.hasEventListener(User.NEW_USER))
                                _user.addEventListener(User.NEW_USER, newUser );
 
                }
 
                private function newUser(e:Event):void {
 
                        _model.setPage(Model.PAGE_REGISTRATION);
 
                        _user.removeEventListener(User.NEW_USER, newUser);
 
                }
 
                override public function run():void {
 
                        AMF.call('User/auth', _user.auth, _user.simple );
 
                        dispatchEvent(new Event(Event.COMPLETE));
                }
        }
}

Код AS3:

package me.inpictures.worker.app {
 
        import me.inpictures.data.User;
        import me.inpictures.Model;
 
        import me.inpictures.worker.Worker;
        import me.inpictures.worker.amf.AMF;
 
        public class Registration extends Worker {
 
                private var _user:User;
                private var _model:Model;
 
                public function Registration(user:User , model:Model) {
 
                        _user = user;
                        _model = model;
                }
 
                override public function run():void {
 
                        AMF.call('User/registration', _user.auth, _user.all );
                }
 
        }
 
}

Подправьте если ушел не в ту степь

Babylon 21.07.2013 04:56

Это всё красивые слова
В основе DI все равно фабричный подход.
Сначала надо правильно создать ядро, а уже потом сделать нужные классы "слабосвязанными" за счет интерфейсов. Собственно для этого их и придумали.

Добавлено через 17 минут
Цитата:

Имеется ввиду что вся структура программы генерируется на основании подгружаемого XML? Если да, для меня пока это будет сложно повторить но про перспективы возможности можно только догадываться )
Это все в рантайме. Поэтому структура программы не может генерироваться.

Добавлено через 41 минуту
Цитата:

Подправьте если ушел не в ту степь
Степь, да степь кругом. Прежде чем показывать свой НИКОМУ [кроме Вас] ненужный код неплохо бы на словах описать архитектуру и картинку нарисовать. Шучу я.

AlexCooper 21.07.2013 12:43

Вложений: 2
Главный контроллер создает главный вьювер и главную модель приложения. И прослушивает модели на изменения.
В зависимости от изменения главной модели он создает "worker"-ы под-контроллеры в которые передает ссылку на модель которую они обрабатывают и ссылку на главную модель для изменения всего приложения. Воркеры меняют эти модели которые в свою очередь генерируют соответсвующие события. Ну и подписанные контроллеры или вьюверы начинают свою работу после изменения моделей.

Babylon 21.07.2013 13:14

Юзер у вас как то мимо данных проскакивает. От кого он получает измененные данные

AlexCooper 21.07.2013 13:24

Да, забыл уточнить, юзера заполняют воркеры, когда пользователь не зарегистрирован, в моделе пользователя срабатывает событие "регистрация" и тут уже в обход главной модели вызывается контроллер REG главным контроллером который слушает модель пользователь.

Akopalipsis 21.07.2013 15:16

Жутко извиняюсь за выбор темы! Начал вникать в robotlegs и конечно начал с примера Hello World, но к сожалению столкнулся с проблемой после нескольких минут. У меня нет класса Actor, swc подключены обе и Context видет точно, много ещё всяких классов. Может кто то сталкивался с этим, в чем может быть дело?

Добавлено через 21 минуту
Вот что получается. В последней 2.1.0 версии нет вообще актера, он есть в старой версии. Уроки ( которые лично мне нужны, я не смогу понять что там к чему не посмотрев ) я пока только для старой версии нашел. И получается, что они больше чем бессмысленные. Если кто то знает о примерах для второй версии, поделитесь.

Akopalipsis 21.07.2013 17:17

okouser Спасибо! Вообще жалко, что нет или возможно просто тяжело найти, принцип работы на русском или хотя бы примеры на других языках. Везде написано - документации и так хватает и что robotlegs служит каким то звеном для связи с внешним миром. Но каким именно звеном или какое место в модели MVC он занимает, мне не понятно.

Akopalipsis 21.07.2013 21:00

Цитата:

к вопросу об Actor
И все же этот фреймворк не столько сложен, сколько про него действительно мало информации.
я смог найти только описание про обьявление инжектируемых классов на хабре, три видео на ютубе ( сирия одних уроков посвящена первой версии и для флекса, вторая просто для первой версии и третья вроде второй ) Посмотреть про первую версию можно, но понятно становится, только то, что есть какие то законы при использовании фраймворка ( наследоваться нужно от чего то конкретного, обьявление классов в специальных как я понял функциях и тд ). Так же если нет ранее существовавшего класса Actor
, то скорее всего что то есть в замен, а если это не так, то у меня ещё больше вопросов появляется, на которые, примеры по вашей ссылке не могут пока мне ответить. я ожидаю в них увидеть строгое разграничение на модель, вьюшку и тому подобное, но там нет этого, там все классы не понятно как то в кучу сложены. Но раз говорят все, что его нужно знать, то буду искать дальше. Если у кого то есть ссылки - делитесь)

Добавлено через 1 час 25 минут
По истечению двух с половиной часов пришёл к выводу, что старые статьи помочь вообще не могут.
В статьях первой версии есть injector.mapClass и тому подобное, во второй части нет такого вообще!
Схожесть только в метатэге [Inject], остальное кардинально отличается. Как быть не даже не знаю.

Akopalipsis 22.07.2013 01:17

Цитата:

Как долго и в скольких проектах вы до этого использовали Robotlegs?
я вообще не чего ещё не использовал, а только учусь!) я только - только понял принцип и предназначение MVC и по ходу дела встречал комментарии о этом фраймворке. И естественно я просто не могу себе отказать его осваивать. Но то что для вас полчаса, для меня несколько дней!) Вы даже и не подумайте, что мои слова звучат как ммммм....не кто не обьясняяяяяеееет.....чтооооо жеее.... НЕТ! То что есть более чем достаточно! И я обязательно разберусь, но все же тяжело разбираться в том чего не знаешь, да ещё на примерах которые мягко говоря устарели. Во многих примерах ссылку this передают в Context и начав делать простой пример у меня не получалось. В одном примере нашёл, что ссылку на отображение надо в ContextView передавать. Потратил несколько часов копания и не жалею. Весь названия методов поменялись, а в примерах даже второй версии, авторы часто прибегают к собственным названиям, которые как по ходу дела я понимаю, были в первой версии. И меня это сбивает. А так же для примера приведу метод map, про который я не смог найти пока не чего. Хотя читал много о первой версии.
....Сейчас посмотрел ваши ссылки, которые Вы привели выше, сейчас буду их смотреть.
И самое главное - Спасибо Вам !

Akopalipsis 22.07.2013 14:49

Цитата:

Вообще-то при скачивании архива с гитхаба там внутри есть html-документация.
Если Вас не затруднит не могли бы Вы дать ссылку на этот архив?) я по двум первым темам все посмотрел и так и не нашёл https://github.com/robotlegs

Akopalipsis 22.07.2013 15:39

Цитата:

там внутри есть html-документация.
я качал этот архив, у меня там нет не одного html документа...Почему у Вас есть, а у меня нет?)

Akopalipsis 22.07.2013 16:55

Цитата:

Либо вы качали не тот архив, либо вы пропустили папку docs.
я даже по Вашей второй ссылке http://github.com/robotlegs/robotleg...ive/master.zip качаю ( это тоже самое, что я раньше качал ) и там нет папки docs..Как такое возможно?)

Добавлено через 44 секунды
У меня сейчас чувство какой то неполноценности)

Добавлено через 1 минуту
И визуально и в папке поиском искал и нет там документации.

Добавлено через 6 минут
Архив у меня называется robotlegs-framework-master.zip и нет там не html не docs...

Akopalipsis 22.07.2013 17:15

okouser Спасибо Большое! Ушел читать)

Добавлено через 1 минуту
okouser Уще раз Спасибо! я даже и не мечтал о такой справке!

Добавлено через 4 часа 20 минут
Сижу разбираюсь и у меня появился вопрос о котором я думаю с самого начала знакомства с MVC. И на этот раз я решил его задать. Создавая онлайн игру, первое что приходит на ум - разбить её логически.
Пакет - юзер, пакет - игра и.. для примера этого будет достаточно. И так же надо представить, что когда в игру заходит пользователь, то у играющих появляется окно с фото и именем вошедшего. И вот тут начинается небольшая путаница, как должно быть - оба пакета должны иметь вью ( у пакета юзер вью собирает ту самую вылезающую табличку ) или только в пакете игра?
И ещё вопрос - если в каждом пакете будет полноценное MVC, то как их более правильно обьединить?
Или уже все пакеты ( для примера представить, что пакет это файл ) строить как одну глобальную MVC ?
я могу представить, что решений очень может быть много, но я боюсь отклонится с правильного пути - посоветуйте что можете.

Добавлено через 4 часа 38 минут
и чтобы не создавать второй раз тему то спрошу http://www.flasher.ru/forum/showthread.php?t=202436


Часовой пояс GMT +4, время: 20:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.