|
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46
|
|||||||||||
Подскажите элегантный подход24.12.2013, 23:29. Показов 980. Ответов 7
Метки нет (Все метки)
Здравствуйте. Предлагаю пример моей реализации. Далее попрошу дать совет по улучшению.
Вот моменты, которые я хотел бы оптимизировать, если возможно:
ЗАЧЕМ ВСЕ ЭТО? Как вы наверно поняли, эта конструкция служит только для цели: 1. Сохранить в файл набор параметров (с возможностью чтения) 2. Выполнять запросы с группой объектов, обращаясь к полям Например
НЕЧЕГО ГОРОДИТЬ ОГОРОД, СУЩЕСТВУЕТ ENTITY FRAMEWORK! ! ! ну а если всё - таки хочется, м? Помогите советом. Если нужно, в ответ помогу финансово. Добавлено через 1 час 22 минуты P.S. Данную задачу можно рассмотреть как задачу кодогенерации T4. Но степень элегантности может сильно варьироваться. Я, например, ни разу ни пользовался T4. Если что сам напишу - выложу
0
|
|||||||||||
| 24.12.2013, 23:29 | |
|
Ответы с готовыми решениями:
7
Подскажите подход к решению Подскажите подход в изучение языка Подскажите алгоритм или подход к решению |
|
Master of Orion
|
||||||
| 25.12.2013, 03:40 | ||||||
|
Mishutka, ну как минимум, чтобы не делать поля, элементарно можно сделать
насчет автоматического сохранения-загрузки - элементарно, помечаем класс как Serializable-XmlType, смотря во что сериализуем, ну и далее собственно сохраняем как душе угодно. Все свойства и поля будут сохранены. Ну а уж с комментариями как-то самому придется разобраться. Добавлено через 1 минуту Конструкторы можно генерировать с помощью решарпера. Для комментариев тоже можно. А вообще ваша задача ятд решается сниппетами решарпера (самописными, например) плюс сериализацией. Ничего особо сложного.
1
|
||||||
|
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
|
| 25.12.2013, 12:07 | |
|
Reflection тоже не поможет.
Можно использовать T4 Text Templates. Как в design так и в runtime. Ну и самое сладкое - Dynamic Programming in the .NET Framework и в нем Dynamic Source Code Generation and Compilation. Вот только стоит ли овчинка выделки? Ибо путь тернист ![]() Стоит пересмотреть структуру? Может лучше использовать что нибуть типа Dictionary<string,object> как хранилище данных? P.S. И причем тут EntityFramework?
1
|
|
|
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46
|
|||||||||||||||||||||
| 25.12.2013, 14:55 [ТС] | |||||||||||||||||||||
|
Спасибо за ответы.
Пишу моедль данных, а сохранение и запись на ЖД система сделает автоматически. Самое главное, изменени модели данных практически никак не влияет на ход процесса .
Прошу развеять мысли об утопичности идеи, и подсказать какими инструментами нужно пользоваться. Новая задача пока задача чисто: что дано, что получить Дано:
Словами Сохранить весь "путь" логики начиная от вхождения в функцию Solve() до возвращения результата из этой функции для каждого вызова функции Solve(). То есть, в текстовом варианте:
Таким образом, имея множество записей, могу АНАЛИЗИРОВАТЬ собственный код! Например
Скажу словами: Я хочу, чтобы в результате работы функции, записывался каждый её шаг (точнее каждый операнд в любой операции) Каждый поворот алгоритма (вызов функции, операторы If, switch и т.д.) В общем сохранить ровно столько данных и той последовательности, чтобы вызвав данную функцию с этими данными получить такой же результат Боюсь я не до конца раскрыл тот образ, что складывается у меня в голове. Но библиотека Алтайского Политехнического университета закрывается. Позже оставлю пост с более "приближенной" задачей
0
|
|||||||||||||||||||||
|
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
|
|
| 25.12.2013, 15:53 | |
|
Даже не знаю... Dynamic Source Code Generation and Compilation вполне может и подойти . Очень тяжело рекомендовать не видя начальной задачи. Всегда есть как минимум два решения
и DSC не самое простое. Как вариант можно попробовать сделать динамические вызова аналогично LINQ Expressions Tree...
1
|
|
| 25.12.2013, 17:21 | ||||||||||||||||
|
Я использую вот такой подход:
Объявляется интерфейс данных
Кликните здесь для просмотра всего текста
Как уже говорил Winsor, используя кодогенерацию, создается вот такой класс, который уже содержит всю необходимую начинку.
1
|
||||||||||||||||
|
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46
|
||||||||||||
| 26.12.2013, 00:12 [ТС] | ||||||||||||
|
Спасибо еще раз за ответы. Мне понядобяться дни, недели или может месяцы чтобы изучить те инструменты, которые вы мне советуете. Но я все же предприму еще одну попытку поставить четкую задачу.
Итак, я пишу бота для игры в покер. (в прочем, не важно для чего. Задача подходит для ЛЮБОГО бота). Мне нужна система анализа моего алгоритма. Итак. поконкретней. Как только наступает ход моего бота, он вызывает начальную функию BotResult Solve(). В общем, приведу небольшой пример (упрощенный вариант, код написал для примера)
1) как часто я находился в позиции для кражи блайдов (вызов DoSteal) 2) как часто я воровл блайнды (результат DoSteal() == Raise) 3) Сколько денег я "наворовал" (у каждой раздачи есть поле, сколько я выиграл в результате) 4) Какой процент прибыльных (для меня) раздач я сыграл воруя блайнды, когда расчетный выигрыш EV > 0.10? ... Таких вопросов я могу придумать сотни. И они все РЕАЛЬНО полезные для анализа моего алгоритма на основе десятков и сотен тысяч сыграных раздач Поэтому ИЗНАЧАЛЬНАЯ ЗАДАЧА: придумать такую волшебную штуку, которая из кода логики сохраняет все пути сыгранных раздач, все значения параметров, используемых в алгоритме, некоторые выбранные промежуточные показатели (например, EV), да ещё так, чтобы можно было писать запросы ко всем сыгранным рукам. По другому, я хочу писать всю информацию в лог-файл, но так структурированно, что получая доступ к каждой ситуации в алгоритме СРАЗУ ПО ВСЕМ раздачам. Еще один момент все переменные, к которым есть доступ в алгоритме, ПОСТОЯННЫЕ. Т.е. пока выполняется начальная ф-ия Solve, никакие из доступных переменных не меняются. (кроме локальных) Все функции (например расчет эквити (CalculateEquity) дают ВСЕГДА один результат на одних и тех входных данных. Таким образом на данных, извлеченных из файла для любой раздачи, получим всегда ТОТ ЖЕ результат, что и в процессе выполнения. Переменные, от которых зависит какой дальнейший путь алгоритма, назовем УПРАВЛЯЮЩИМИ. В примере выше к ним относятся: betRound,position, limps,raises, EV, OurHand Промежуточные переменные служат для вычисления УПРАВЛЯЮЩИХ. В примере выше: eq, prob. Управляющими ФУНКЦИЯМИ назовем все функции, у которых возвращаемый тип BotResult. Сформировалось требование:
Задача 2. Работа с массивом сохраненных данных Получили все необходимые данные, но как с ними работать сразу по всем раздачам? Хотелось бы иметь следующий доступ: (для тех вопросов, что я описал в начале)
position limps raises для класса Do_Steal: prob (при желании) eq (при желании) EV (обязательно) Спасибо, что хватило терпения дочитать! (если только не пролистали к итогу )P.S. Пока подробно писал, что и как должно работать, в голове начала рисоваться картинка, что к чему. Поэтому спасибо тем, кто отвечал на мои посты! Даже если я не прислушался к вашему совету, мне помогло то, что вы сподвигли меня разобраться подробней в своей задаче! P.P.S. это не означает, что я не ценю содержимое ответа
0
|
||||||||||||
|
Master of Orion
|
||||||
| 26.12.2013, 01:52 | ||||||
|
Mishutka, возможно, есть смысл изменить switch case на полиморфизм, то есть ввести классы PerfolopSolver, FlopSolver и пр, отнаследовать их от интерфейса ISolver или абстрактного класса HoldemSolver, можно ввести для него какое-нибудь поле типа calls, тогда:
0
|
||||||
| 26.12.2013, 01:52 | |
|
Помогаю со студенческими работами здесь
8
Есть ли более правильный и элегантный способ реализации функции? Найти самый элегантный путь для логирования. Возможно с использованием паттернов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|