Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Pango

Оценить эту запись

EscoStorage - решение проблемы хранения данных на ранних этапах разработки клиента.

Запись от pango размещена 22.11.2012 в 16:12

EscoStorage - решение проблемы хранения данных на ранних этапах разработки клиента.
Если приложение оперирует данными их надо где-то хранить, и как-то редактировать.
На первых порах мы хотим обойтись без базы, данных у нас мало (только для тестов)
а поля моделей будут часто меняться, это черевато издержками на миграции.

Но мы хотим иметь похожий на выгрузку формат, удобные формы для редактирования и заливки файлов.
Тут на помощь и приходит EscoStorage, основываясь на коде ваших классов,
он на лету генерирует формы для их редактирования, заливает в целевые папки файлы
и вписывает относительные пути к ним в нужные поля.



Данные храняться в json-строке, которая после загрузки конвертируется
в типизированные экземпляры as-классов (никаких парсеров писать не надо),
со всеми связями, в том числе списочными.

Как это работает, используются три проекта:
  • библиотечный проект, где вы описываете модели
  • air-проект, EscoAdmin, в котором вы ссылаетесь на модели и определяете путь хранения файла с данными и папку куда будет заливаться статика.
  • третий - ваш проект в котором вы пользуетесь созданным хранилищем.

Подробности.

Библиотека моделей.

Каждый из классов модели наследуется от класса абстрактной записи(AbsRecord).
его поля могут быть следюущих типов int, uint, Number, String, Boolean,
наследник AbsRecord (реализация foreign-key),
либо вектор наследников AbsRecord (по сути many-to-many).

Например мы описываем 3 модели: Author, Genre и Book,
при этом у автора есть поле имени,
у жанра тоже есть поле имени,
а у книги помимо имени, будут автор и список жанров к которым она относиться,
в этом случае

Author.as
Код AS3:
package com.owl.examples.storage.models
{
	import com.owl.db.AbsRecord;
 
	public class Author extends AbsRecord
	{
		public var name:String
	}
}
Genre.as
Код AS3:
package com.owl.examples.storage.models
{
	import com.owl.db.AbsRecord;
 
	public class Genre extends AbsRecord
	{
		public var name:String
	}
}
Book.as
Код AS3:
package com.owl.examples.storage.models
{
	import com.owl.db.AbsRecord;
 
	public class Book extends AbsRecord
	{
		public var title:String
		public var author:Author
		public var genres:Vector.<Genre>
	}
}
это классы модели, полагаю с ними всё понятно,
теперь служебный компонент, который надо будет передавать админскому эир-приложению

ExampleStorage.mxml
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<db:DataBase 
		xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:db="com.owl.db.*" 
		>
 
	<db:tables>
		<db:Table type="{Author}"/>
		<db:Table type="{Book}"/>
		<db:Table type="{Genre}"/>
	</db:tables>
 
	<fx:Script>
		<![CDATA[
			import com.owl.examples.storage.models.*
		]]>
	</fx:Script>
 
</db:DataBase>
С библиотекой моделей всё, переходим к проекту администрирования,
он состоит из одного приложения вида:

MyAdmin.mxml
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<admin:EscoAdmin
		xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:admin="com.owl.esco.admin.*"
		xmlns:storage="com.owl.examples.storage.*"
 
		default_path="c:/папка_куда_сохраняется_файл_с_данными/storage.esf"
		>
 
	<admin:db>
		<storage:ExampleStorage prefix="c:/папка_куда_сохраняется_файл_с_данными/под-папка_где_храняться_залитые_файлы/"/>	
	</admin:db>
 
 
</admin:EscoAdmin>
фактически, ему передаётся три аргумента,
экземпляр служебного класса, который знает о ваших моделях (ExampleStorage)
путь к файлу в котором будут храниться данные (*.esf)
и путь к папке в которую сохраняются залитые файлы (картинки, звук и тп)

Запустив его, увидим слева список моделей (картинка была выше)
если кликнуть на одну из них, можно будет создать запись этого типа,
а по клику на неё, заполнить данными.

Создав несоколько записей, сохранимся и посмотрим, что у нас получилось.

Создадим третий проект, сославшись на на библиотеку с моделями.
После этого можно загружать хранилище, указав с какими моделями мы будем работать.
Когда файл с данными будет загружен мы можем оперировать ими как обычными экземплярами as-классов,
которые мы объявили их в библиотеке.

Esco_storage_example_client.as
Код AS3:
package
{
	import com.owl.db.*;
	import com.owl.examples.storage.models.*;
 
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;
 
	public class Esco_storage_example_client extends Sprite
	{
		private var loader:DBLoader = new DBLoader()
		private var storage:DataBase = new DataBase()
 
		public function Esco_storage_example_client()
		{
			storage.create_table_for(Author)
			storage.create_table_for(Book)
			storage.create_table_for(Genre)
 
			loader.addEventListener( Event.COMPLETE, on_complete)
			loader.load_to(storage, new URLRequest('c:/esco_example/storage.esf'))
		}
 
		private function on_complete(e:Event):void
		{
			var list:Array = storage.get_table(Book).list
			for each (var book:Book in list)
			{
				trace ('--------------------------')
				trace ( book.title )
				trace ( book.author.name )
 
				for each (var genre:Genre in book.genres)
				{
					trace (genre.name)
				}
			}
		}
 
}}
Если данные были заполненны верно, в трейсе будут показаны все книги с авторами и жанрами.

Тут можно скачать все три проекта одним архивом

Если тема вызовет интерес, опишу остальные фичи (группировка типов, заливка файлов, загрузка файловых полей из клиента, кастомные рендереры, руссификация полей c помощью метадаты и тп.)
Всего комментариев 23

Комментарии

Старый 22.11.2012 22:13 GBee вне форума
GBee
 
Аватар для GBee
Я вот понимаю, что вроде прикольно. Но не понимаю, что мне не нравится. Буду думать.

А вы изначально пхпшник?
Старый 23.11.2012 00:01 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Это что-то вроде phpMyAdmin?
Старый 23.11.2012 02:23 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Цитата:
Каждый из классов модели наследуется от класса абстрактной записи(AbsRecord).
зачем?
Старый 23.11.2012 02:58 Котяра вне форума
Котяра
 
Аватар для Котяра
у вас не модель, а просто VO
Старый 23.11.2012 04:57 pango вне форума
pango
 
Аватар для pango
По функционалу пересекается с phpMyAdmin,
только в обслуживании проще, не просит сервер,
сам строит формы по классам, ну по мелочи.
Помимо as пишу на питоне, и некоторые подходы позаимствовал из django.
Отсюда и термин модель, там всё что храниться так называется,
не вижу причин называть это по другому.
VO - это такое?

А, без наследования неудобно, все записи имеют поле id,
и ряд общих методов save, remove, get_desc, desc_for_editor (аналог __unicode__() из dgango)
Старый 23.11.2012 10:36 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Цитата:
VO - это такое?
по-моему, Value Object, но я считаю вполне можно называть моделью в данном контексте.

Джанго - крутая штука, да
Старый 24.11.2012 01:36 Котяра вне форума
Котяра
 
Аватар для Котяра
Ну может быть, просто я привык, что модель - это не только данные, но и диспетчер изменений.
Впринципе, если расширить VO от EventDispatcher и на каждое поле повесить [Bindable] то тоже норм.
Старый 24.11.2012 01:38 Котяра вне форума
Котяра
 
Аватар для Котяра
И ещё замечание автору. Используйте всё-таки общепринятые в конкретном языке конвенции наименований.
create_table_for
createTable
Старый 24.11.2012 01:55 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Кстати на счет конвенций. Что-то я не могу таковые найти на сайте адоба (именно там). То что находится через тырнет - битые ссылки. Подскажет кто?
Старый 24.11.2012 02:22 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Старый 24.11.2012 04:45 Котяра вне форума
Котяра
 
Аватар для Котяра
Юра Яровой, по просьбам трудящихся, восстановил страничку
http://garbage-collector.ru/2008/06/...n_russian.html
Старый 24.11.2012 07:59 pango вне форума
pango
 
Аватар для pango
Рискуя навлечь на себя гнев общественности,
всё же выскажу своё мнение, кемелКейс - не читабелен, в силу своей противоестественности.
Комобинация createTableFor, однозначно воспринимается хуже чем create_table_for .

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

Результат: имена классов визуально отличаются от всего остального,
а названия методов и полей читаются легче.
Обновил(-а) pango 24.11.2012 в 09:00
Старый 24.11.2012 08:42 КорДум вне форума
КорДум
 
Аватар для КорДум
Цитата:
Рискуя навлечь на себя гнев общественности
Миллионы людей не могут ошибаться [x]
Да, сейчас налетят =)

А теперь представьте, что у вопиющего большого большинства принята в мозгу (или на работе тимлидер принял) конвенция адобовская. Они подключают Вашу либу и видят... о боты! — php-неООПстайл! Честно, вот я бы не поленился, полез во всех классы и насильно отрефакторил.

Ну и да, конвенцию языка нужно корректировать под ту или иную среду, в которой он крутится. В данном случае все стараются придерживаться адобовской с незначительными отклонениями.
Старый 24.11.2012 13:52 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
В AS3 при именовании переменных и методов используется стиль Кэмэл, для имен классов - Паскаль. Это придумано давно и большая часть разработчиков следует этим указаниям, но есть и те кто ими пренебрегает. И все бы ничего, каждый при своем. Но как только на деле появляется работа с чужим кодом, с кодом который оформлен черти как, тогда приходится либо все рефакторить, либо потратить много-много нервных клеток, читая. А самое интересное начинается, после длительной работы с чужим кодом, когда начинает казаться, что весь код оформлен не "правильно".

пс.
Цитата:
Комобинация createTableFor, однозначно воспринимается хуже чем create_table_for .
из соглашение по оформлению кода команды RSDN
Цитата:
Не используйте подчеркивание для отделения слов внутри идентификаторов, это удлиняет идентификаторы и затрудняет чтение. Вместо этого используйте стиль именования Кемел или Паскаль.
кому верить?

пс2.
Мне вот с таким часто приходится работать. Вы не представляете даже, какие при этом лучи счастья и добра отправляются автору.
Код AS3:
public function get all_next_quests_tree()
Код AS3:
protected function _recalculate()
Код AS3:
protected static var on_start_load_event : Function
Старый 24.11.2012 14:10 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
всё же выскажу своё мнение, кемелКейс - не читабелен, в силу своей противоестественности.
Составные названия полей и методов состоящих из более чем трёх слов,
без разрядки воспринимаются совсем адски неудобно.
Если так рассуждать, то любое написание противоестественно, ибо от рождения, а естественно только то, что дано нам сразу, человек не умеет читать. И когда начинают учить, сначала буквы, потом слога, потом слова, все это воспринимается адски сложно. Лучше же использовать картинки! Но вот проходит время и человек начинает читать бегло, воспринимая буквы не как буквы, а как слово. А некоторые умеют читать не только слева направо, но и наоборот, например по-арабски.

А видели немецкий язык? Например слово Bildungseinrichtungen (образовательное учреждения) или Regimentskommandeur (командир полка). Два слово объединяют в одно и тут вообще никаких кейсов по среди слова. И немцы спокойно их читают, они так научились.

Я 16 лет использую кемел кейс и проблем с чтением никогда не возникало. Привык, что такое написание означает цельную конструкцию, а вот sprite_car.goto_and_stop я воспринимаю как sprite cargoto and stop, так как подчеркивание более массивное чем точка. Но это лишь отсутствие привычки. Пару дней с таким кодом, и читал бы кемел кейс.

Так что ко всему можно привыкнуть, было бы желание, а не отговорки.
Старый 24.11.2012 14:52 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Ну на самом деле автор уже упомянул, что помимо as3 пишет и на python/django. Написание через подчеркивание - чисто пайтоновский стиль, а не "php-неООПстайл!" Нормальный php-стиль очень похож на as3.

На работе пишем на php/js кэмел кейсом, сейчас перелезли на django. Придерживаясь правилам последнего, пишем через нижнее подчеркивание.
Старый 24.11.2012 14:53 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Для меня это вопрос решённый, я отказался кемелкейса,
Использование или неиспользование конвенции даже не обсуждается. Вы должны использовать адобовскую. Точка.
Старый 24.11.2012 18:01 Котяра вне форума
Котяра
 
Аватар для Котяра
Старый 24.11.2012 18:05 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Со своим уставом в чужой монастырь. Ладно бы Вы лично для себя писали, но Вы же решили поделиться своими наработками. А в таких случаях делают так, как удобно большинству. Форум существует для того, чтобы показывать, как нужно делать, тем более в блогах. Должен же кто-то давать стандарт? На Вашем месте я бы прислушался и все исправил, иначе полезность Вашей записи стремится к нулю.
Старый 24.11.2012 18:29 pango вне форума
pango
 
Аватар для pango
Цитата:
Использование или неиспользование конвенции даже не обсуждается. Вы должны использовать адобовскую. Точка.
А считать что земля зиждиться на трёх китах не должен?

Цитата:
Не используйте подчеркивание для отделения слов внутри идентификаторов, это удлиняет идентификаторы и затрудняет чтение. Вместо этого используйте стиль именования Кемел или Паскаль.
кому верить?
Я выбираю свои глаза, им я точно могу доверять.
Я использовал кемелкейс достаточно долго, и пришёл к выводу что он плох.
И если я встречаю более жизнеспособный подход я беру его на вооружение,
конвенции не повод идти на сделки с совестью, и делать свою жизнь хуже.
Если вы не имеете своей точки зрения, пользуйтесь общепринятной,
а я остансь при своей.

Писал для себя, хотел поделиться, если для вас форма важней содержания, не пользуйтесь.
Для меня это точно не повод поступаться своими принципами.
Старый 24.11.2012 18:55 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Если вы не имеете своей точки зрения, пользуйтесь общепринятной,
а я остансь при своей.
Звучит как: можно сделать как я или неправильно.
Цитата:
Писал для себя, хотел поделиться, если для вас форма важней содержания, не пользуйтесь.
Для меня это точно не повод поступаться своими принципами.
То что вы поделились, это замечательно. Но так не пойдет. Если лично вам удобны подчеркивания, то ради бога. Но раз вы вышли с продуктов в общество, то должны соблюдать правила этого общества. А сейчас вы противопоставляете себя всем. Либо пользуйтесь и мучайтесь, потому что "мне так удобно", либо не пользуйтесь. Чести вам это не делает.
Старый 24.11.2012 19:53 pango вне форума
pango
 
Аватар для pango
Цитата:
Звучит как: можно сделать как я или неправильно
Делайте как вам удобно, я ничего не навязываю.
Но, за собой я оставляю право выбирать комфортную мне форму записи,
отнять её у меня всё равно невозможно.

Если мне не нравятся названия методов, или порядок аргументов в сторонней либе
я просто обёртываю её, поэтому сам никогда не финализирую классы.
Написание обёртки занимает чуть-чуть времени, но заметно повышает комфорт.
А обменивать комфорт на потёмки чужих душ практика порочная.
Старый 24.11.2012 20:36 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Цитата:
Если мне не нравятся названия методов, или порядок аргументов в сторонней либе
я просто обёртываю её, поэтому сам никогда не финализирую классы.
Написание обёртки занимает чуть-чуть времени, но заметно повышает комфорт.
А обменивать комфорт на потёмки чужих душ практика порочная.
В AS3 нет макросов, поэтому подход с написанием оберток по определению ущербный (понижает качество кода, не принося программе никакой выгоды, и отнимая время на написание). Т.о. например, если бы меня заказчик обязал зачем-то использовать ваши наработки, я бы написал какой-нибудь скрипт, который бы исправил ваши исходники, если такое позволяет лицензия. Если нет - не использовал бы.

У вас возможно отнять не форму записи, а работу, которая побудила вас использовать ту, или иную форму записи. Если вы пишете код вопреки конвенции - у вас ее отберут И писать вы сможете как угодно, только это перейдет в ранг хобби, а не заработка.
 

 


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


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