Re[41]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 25.09.14 16:27
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

EP>>Например, упомянутый ранее ODB, использует как раз препроцессинг исходников

НС>Вот это и плохо.

Что именно?
Внешняя тулза для C# это хорошо, а для C++ — плохо?
Re[8]: cppcms
От: Хон Гиль Дон Россия  
Дата: 25.09.14 16:55
Оценка: +1
Здравствуйте, genre, Вы писали:


ХГД>>Гуглу и Фейсбуку про это расскажи, ага.


G>не надо путать реальный high load с экономией на спичках.


Для начала, не надо делать космического масштаба обобщений.

G>то что тут продемонстрировано делается за 1 день работы + хостинг ценой в доли процента от зарплаты программиста.


То что тут продемонстрировано, сильно напоминает и прочие продукты творчества скучающих сисадминов.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: cppcms
От: Sheridan Россия  
Дата: 25.09.14 17:34
Оценка:
Здравствуйте, 0BD11A0D, Вы писали:

BDA>То, что вы пример (? — точно не знаю, но похоже на то) редкого сиплюсплюсника, который стоит дешевле сервера, меня мало интересует. Это проблемы вашего ЧСВ (правильно употребил?).


ВНЕЗАПНО я не программист
Matrix has you...
Re[35]: cppcms
От: Sheridan Россия  
Дата: 25.09.14 17:39
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Person, точно соотвествующий таблице, вообще руками писать не надо, он генерируется автоматично по схеме БД.

НС>А запросы твои — очень просто:
НС>
НС>db.CreateTable<Person>();
НС>for(int i=0; i<10; i++)
НС>  db.Persons.Insert(new {ID = i, Name = "name_" + i, Total = Math.Sin(i/3.0)});
НС>// Неправильный вариант, как у тебя
НС>foreach (var person in db.Persons)
НС>    Console.WriteLine("{0} {1} {3} {4}", person.ID, person.Name, person.Total, person.Runtime);
НС>// Правильный вариант
НС>foreach (var person in db.Persons.Select(p => new {p.ID, p.Name, p.Total, p.Runtime}))
НС>    Console.WriteLine("{0} {1} {3} {4}", person.ID, person.Name, person.Total, person.Runtime);
НС>


НС>Я до сих пор не понимаю что ты продемонстрировать хочешь.

Ктото говорил что нет объектной прослойки между взятыми из БД данными и местом их использования...
Не подскажешь, кто?
Matrix has you...
Re[42]: cppcms
От: Ночной Смотрящий Россия  
Дата: 25.09.14 17:55
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

НС>>Вот это и плохо.

EP>Что именно?

Парсинг исходников непойми чем плохо. По крайней мере вне конвеера компилятора. Подход D, Nemerle и Roslyn, да, более менее приемлем при условии высокого качества исполнения. Но этого в С++ нет и неизвестно когда будет.
Re[36]: cppcms
От: Ночной Смотрящий Россия  
Дата: 25.09.14 17:55
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Ктото говорил что нет объектной прослойки между взятыми из БД данными и местом их использования...


Я говорил. И даже пример тебе привел. Но в предложенном варианте было именно с прослойкой, я ее и воспроизвел.
Re[7]: cppcms
От: Ночной Смотрящий Россия  
Дата: 25.09.14 17:56
Оценка: 1 (1)
Здравствуйте, Sheridan, Вы писали:

BDA>>То, что вы пример (? — точно не знаю, но похоже на то) редкого сиплюсплюсника, который стоит дешевле сервера, меня мало интересует. Это проблемы вашего ЧСВ (правильно употребил?).

S>ВНЕЗАПНО я не программист

Проблема не в том что ты не программист, проблема в том что ты агрессивно пытаешься спорить с тем, что говорят тебе программисты.
Re[8]: cppcms
От: Sheridan Россия  
Дата: 25.09.14 18:10
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Проблема не в том что ты не программист, проблема в том что ты агрессивно пытаешься спорить с тем, что говорят тебе программисты.

Проблема в том, что они не говорят, они навязывают. Даже после того что я говорю им что это скорее хобби. Это вторая проблема: они видимо не могут понять что программирование на с++ может быть хобби. У них в головах профессиональные цепочки действий для реализации проетов выстраиваются. А мне эти цепочки неинтересны.
Это как если бы я начал коллекционировать марки, а все вокруг начали мне навязывать коллекционирование значков. Мне глубоко пофиг, мне марки нравятся.
Matrix has you...
Отредактировано 25.09.2014 18:11 Sheridan . Предыдущая версия .
Re[43]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 25.09.14 18:20
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Парсинг исходников непойми чем плохо. По крайней мере вне конвеера компилятора. Подход D, Nemerle и Roslyn, да, более менее приемлем при условии высокого качества исполнения. Но этого в С++ нет и неизвестно когда будет.


Так в случае ODB "парсит" как раз компилятор
И, например, на базе Clang подобные тулзы делаются влёт.
Re[38]: cppcms
От: artelk  
Дата: 25.09.14 18:36
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, artelk, Вы писали:


Во-первых, спасибо!

Во-вторых, придирки:

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

EP>По умолчанию, await возвращается в main_context, но точку возврата для текущей корутины можно поменять через switch_context_to. В данном примере, часть корутин после выполнения задания worker_context'ом "просыпается" в нём же.


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

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

UPD: Хотелось бы, чтоб по завершению IO операции можно было вообще не уходить\перескакивать из IOCP потока, до тех пор, пока не потребуется — т.е. будет запущена другая асинхронная операция, выполняющая продолжение в рабочих потоках пула (т.е. Task.Run, Task.Delay и т.п.) — лишние переключения не нужны.

EP>// await is not limited by "one level" as in C#

Всмысле?

void reschedule()
{
    boost::this_thread::sleep_for(boost::chrono::milliseconds( rand() % 2000 ));
}

auto some_async_operation()
{
    return async([]{ return reschedule(), 1; });
}


Тут создание и блокировка потока будет, правильно? Task.Delay(N) работает хитрее — текущий поток освобождается и возвращается в пул. Продолжение будет добавлено в очередь заданий через N ms. Нет такого, что на каждый Task.Delay тратится по потоку на ожидание\засыпание.

EP>// Full emulation of await feature from C# language in C++ based on Stackful Coroutines from

EP>// Boost.Coroutine library.
Пока рано такие заголовки вставлять

A>>Хотелось бы увидеть образцово-показательный код на С++, чтобы в качестве сервисного метода было, например, что-то вроде такого:

A>>
A>>async Task<byte[]> GetValue(byte[] bytes)//bytes - пришедшие от клиента данные
A>>{
A>>...
A>>}
A>>

A>>На сколько реализуемо?

EP>Не пойму что концептуально нового добавляет этот пример по сравнению с предыдущим.


Мечталось погонять готовый сервис на предмет масштабируемости.
Отредактировано 25.09.2014 19:16 artelk . Предыдущая версия .
Re[35]: cppcms
От: alex_public  
Дата: 25.09.14 19:12
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>>>Цитирование кода работает во время компиляции. И даже заранее скомпилировать запросы часть провайдеров позволяет. Наконец сама забота об ускорении на доли секунды стартапа серверных приложений отдает шериданством.

_>>Не смеши меня. Никакой jit даже близко не сравним с оптимизатором кода типа современного gcc, icc и т.п.
НС>Разговор с глухим. Никакой логической связи между процитированным и ответом.

Это был ответ на "стартап серверных приложений". А по поводу работы во время компиляции тебя Евгений уже расспросил и выяснилось что на самом деле это совсем не так...

_>>Ну загрузка/выгрузка объекта в таблицу мне кажется весьма удобной и главное максимально типобезопасной.

НС>Берешь NoSQL в руки и вперед. А РСУБД ты так только раком сможешь поставить.

А в чём ты видишь принципиальную проблему?

_>> Код на C++ ты видел.

НС>Так и для того же linq2db код будем примерно таким же.

Пока не видно. Покажи. )

НС>Person, точно соотвествующий таблице, вообще руками писать не надо, он генерируется автоматично по схеме БД.

НС>А запросы твои — очень просто:
НС>
НС>db.CreateTable<Person>();
НС>for(int i=0; i<10; i++)
НС>  db.Persons.Insert(new {ID = i, Name = "name_" + i, Total = Math.Sin(i/3.0)});
НС>// Неправильный вариант, как у тебя
НС>foreach (var person in db.Persons)
НС>    Console.WriteLine("{0} {1} {3} {4}", person.ID, person.Name, person.Total, person.Runtime);
НС>// Правильный вариант
НС>foreach (var person in db.Persons.Select(p => new {p.ID, p.Name, p.Total, p.Runtime}))
НС>    Console.WriteLine("{0} {1} {3} {4}", person.ID, person.Name, person.Total, person.Runtime);
НС>


НС>Я до сих пор не понимаю что ты продемонстрировать хочешь.


В твоём варианте поле Runtime находится в базе, а его там быть не должно.
Re[11]: cppcms
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 25.09.14 19:25
Оценка:
Здравствуйте, Хон Гиль Дон, Вы писали:
ХГД>Здравствуйте, kochetkov.vladimir, Вы писали:

KV>>Прямого аналога eval'а из динамических языков в нем нет. А то, как он там может быть сымитирован, сводит количество тех, кто стал бы этим пользоваться в продуктивных приложениях к единицам.

ХГД>Но аппарат имеется? Как и соответствующие способы выстрелить себе в ногу в C++.

Ты пытаешься доказать, что допустить RCE в C#-коде не сложнее, чем в C++? Смешно, шутку оценил

ХГД>Я не знаю, что ты хотел сказать, но прекрасно вижу, что сказал в результате


Я также не вижу смысла и в обсуждении проблем чужого восприятия.

ХГД>Ок, так и запишем — случаи атак через специальным образом сформированные utf-8 строки тебе неизвестны.


По ссылке, от которой ты так упорно отбрыкиваешься, приведены десятки примеров атак на реальные приложения через специально сформированные unicode-строки.

ХГД>Меня, собственно, удивило, почему ты их назвал "лишними телодвижениями"


Потому что в коде на управляемом языке их совершать не нужно.
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[36]: cppcms
От: Ночной Смотрящий Россия  
Дата: 25.09.14 19:27
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Это был ответ на "стартап серверных приложений".


И какая связь между стартапом серверных приложений и gcc?

_> А по поводу работы во время компиляции тебя Евгений уже расспросил и выяснилось что на самом деле это совсем не так...


Во как. А мужики то и не знали.

НС>>Берешь NoSQL в руки и вперед. А РСУБД ты так только раком сможешь поставить.

_>А в чём ты видишь принципиальную проблему?

В текущей абстракции. С РСУБД нельзя работать как с графом объектов, с ней нужно работать как с реляционными данными. Иначе проблемы гарантированы.


НС>>Я до сих пор не понимаю что ты продемонстрировать хочешь.

_>В твоём варианте поле Runtime находится в базе, а его там быть не должно.

Ничего не понял. А где оно быть должно? Я тебе уже который раз говорю — я в твою голову залезть не могу и что ты хочешь продемонстрировать не понимаю.
Re[39]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 25.09.14 19:32
Оценка:
Здравствуйте, artelk, Вы писали:

A>На сколько удалось распарсить, у каждого рабочего потока своя очередь.


Да.

A>Нафига?


Это демонстрация эмуляции await, а конкретно перекидывание управления между потоками, а не какой-то реальный код. Scheduling может быть каким угодно.
Например вот тут два примера использования корутин с простейшим win32 gui interaction:
http://rsdn.ru/forum/philosophy/5215367.1
Автор: Evgeny.Panasyuk
Дата: 29.06.13

http://rsdn.ru/forum/philosophy/5223345.1
Автор: Evgeny.Panasyuk
Дата: 08.07.13


A>Кстати, а почему он один?


Кто один? Один рабочий поток на "пул"? А зачем больше? Цель — показать как корутина может мигрировать между потоками/контекстами, двух потоков/контекстов для этого достаточно.

A>Остальные ядра процессора тупо простаивать будут, в то время как к нашему сервису целая толпа клиентских запросов в очередь выстроилась?


Это не демонстрация реализации сервиса.

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


В этом конкретном примере действие добавляется в очередь сообщений потока.

A>(в то время как остальные потоки пула могут быть свободны)?


Если потоков для "возврата" несколько — то можно делать какую угодно балансировку, но это уже детали работы планировщика, а не эмуляции await.
Грубо говоря, этот await цепляется к любой асинхронной операции которая может принять handler, а как и где именно эти операции вращаются — дело ортогональное.
Например, C#'ский await работает не только для сетевых или gui приложений. В то же время эти сетевые и gui приложения работали и без await'а, и у них были уже готовые планирощики — await просто помогает упростить код, сам по себе он потоки не распределяет.

A>Или нужно не давать потоку ничего делать, пока операция не закончится? Так это же блокировкой называется, будет по потоку на запрос.


Нет блокировки, например это видно из шапки лога:
Thread ID=7fe0cff85700 Coro ID=0: entry_point{A}
Thread ID=7fe0cff85700 Coro ID=1: foo{A}, arg=10
Thread ID=7fe0cff85700 Coro ID=2: foo{A}, arg=20

Когда корутина Coro ID=1 дошла до точки foo{A} — она начала await'ить асинхронную операцию. Но в это время поток не заблокирован (это видно по Thread ID), а перешёл к выполнению корутины Coro ID=2.

A>А если не по умолчанию, нужно указать конкретный поток в котором нужно будет продолжится? Дык, та же проблема.


В каком смысле? То есть в какой конкретно поток нужно вернуться будет зависеть, например, от того какой свободен? Тоже не проблема — это ортогональные детали планировщика.

EP>>// await is not limited by "one level" as in C#

A>Всмысле?

Функция foo вызывает bar. В C# пришлось бы ставить async на bar, а тут нет. То есть вызов await может находится на какой угодно глубине, в отличии от C# (где это возможно только в пределах async методов).
Это позволяет, например, взять обычный синхронный код, передать ему объекты-stream'ы с await'ом внутри — и всё заработает без изменений.
http://rsdn.ru/forum/philosophy/5206735.1
Автор: Evgeny.Panasyuk
Дата: 21.06.13


A>Тут создание и блокировка потока будет, правильно?


Создание будет, а блокировки — нет.

A>Task.Delay(N) работает хитрее — текущий поток освобождается и возвращается в пул. Продолжение будет добавлено в очередь заданий через N ms. Нет такого, что на каждый Task.Delay тратится по потоку на ожидание\засыпание.


Это всего лишь пример какого-то асинхронного действия. В том же коде есть post_task, который использует уже готовый поток. И вообще всё может работать в одном потоке.

EP>>// Full emulation of await feature from C# language in C++ based on Stackful Coroutines from

EP>>// Boost.Coroutine library.
A>Пока рано такие заголовки вставлять

Почему же? Эмуляция работает, синтаксис такой же, мощности даже больше чем в оригинале.

A>Мечталось погонять готовый сервис на предмет масштабируемости.


Для таких тестов ограничиваться await'ом не обязательно, корутины для реализации подобных сервисов можно использовать сами по себе, без эмуляции await.
В Boost.Asio даже есть готовые рецепты, например:
http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/reference/spawn.html
http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp
char data[128];
for (;;)
{
    std::size_t length = my_socket.async_read_some(boost::asio::buffer(data), yield);
    boost::asio::async_write(my_socket, boost::asio::buffer(data, length), yield);
}


Лично тестировал
Автор: Evgeny.Panasyuk
Дата: 30.11.13
только запуск сотен тысяч корутин в одном потоке, вне контекста сети.
Re[37]: cppcms
От: alex_public  
Дата: 25.09.14 20:08
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

_>>Это был ответ на "стартап серверных приложений".

НС>И какая связь между стартапом серверных приложений и gcc?

ОК, давай начнём сначала. В какой точке код выдаваемый Expression превращается в код типа лямбды (следуя твоему примеру выше)? Или никогда не превращается? )

НС>В текущей абстракции. С РСУБД нельзя работать как с графом объектов, с ней нужно работать как с реляционными данными. Иначе проблемы гарантированы.


Ну т.е. проблема возникает только если мы сделаем такую глупость, как указание сохранять поля объекта, не являющиеся элементарными типами? )

_>>В твоём варианте поле Runtime находится в базе, а его там быть не должно.

НС>Ничего не понял. А где оно быть должно? Я тебе уже который раз говорю — я в твою голову залезть не могу и что ты хочешь продемонстрировать не понимаю.

Зачем залезать в мою голову, если я показал полноценный C++ пример? Там чётко видно, что в базе данных такого поля нет. А у объекта оно есть и инициализируется в его конструкторе (в данном примере текущим временем).
Re[38]: cppcms
От: Ночной Смотрящий Россия  
Дата: 25.09.14 20:15
Оценка:
Здравствуйте, alex_public, Вы писали:

_>ОК, давай начнём сначала. В какой точке код выдаваемый Expression превращается в код типа лямбды (следуя твоему примеру выше)? Или никогда не превращается? )


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

НС>>В текущей абстракции. С РСУБД нельзя работать как с графом объектов, с ней нужно работать как с реляционными данными. Иначе проблемы гарантированы.

_>Ну т.е. проблема возникает только если мы сделаем такую глупость, как указание сохранять поля объекта, не являющиеся элементарными типами? )

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

НС>>Ничего не понял. А где оно быть должно? Я тебе уже который раз говорю — я в твою голову залезть не могу и что ты хочешь продемонстрировать не понимаю.

_>Зачем залезать в мою голову, если я показал полноценный C++ пример?

Я не понимаю пример чего ты там показал.

_> Там чётко видно, что в базе данных такого поля нет.


Мне — не видно. И совсем не ясно к чему там вообще это поле, зачем его запихивать внутрь объекта и что ты с его помощью демонстрируешь. И ари чм тут вообще линк. Ты сомневаешься в возможности объявить на шарпе поле и проинициализировать его в конструкторе? Никаких проблем с этим нет, хоть и осмысленность данного шага не очень понятна:
partial class Person
{
    int Runtime { get; } = DateTime.Now;
}

Вопрос то твой в чем?
Re[39]: cppcms
От: alex_public  
Дата: 25.09.14 21:24
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Не, если сначала, то сперва ответь — зачем в серверном софте заниматься оптимизацией долей секунды при стартапе?


Абсолютно незачем. Теперь твоя очередь отвечать откуда взялся "стартап". )

НС>Нет. Проблема возникает всегда, когда объекты используются как нечто большее, нежели хранилище метаданных и плоские POCO.


Собственно ты тоже самое и сказал. В общем если не пытаться сохранить в БД неподходящие вещи, ORM весьма удобен (конечно при условии, что он реализован без потерь производительности, а то в java и скриптовых языках иногда ТАКОЕ встречается).

НС>Я не понимаю пример чего ты там показал.


Это пример сохранения в БД экземпляра класса, написанного не нами (и не созданного изначально для прямого отображения в БД). У него есть как необходимые для сохранения/востановления поля (которые мы и кладём в табличку), так и инициализируемые им самим (и нужные для дальнейшей работы).

НС>Мне — не видно. И совсем не ясно к чему там вообще это поле, зачем его запихивать внутрь объекта и что ты с его помощью демонстрируешь. И ари чм тут вообще линк. Ты сомневаешься в возможности объявить на шарпе поле и проинициализировать его в конструкторе? Никаких проблем с этим нет, хоть и осмысленность данного шага не очень понятна:

НС>
НС>partial class Person
НС>{
НС>    int Runtime { get; } = DateTime.Now;
НС>}
НС>

НС>Вопрос то твой в чем?

Нет, я хочу увидеть работу с уже существующим классом. Сохранение/выгрузку части его полей. Вроде как абсолютно тривиальная задача, которая вполне может возникнуть в случае использования сторонних библиотек (и необходимости сохранения состояния объектов оттуда).
Re[40]: cppcms
От: artelk  
Дата: 25.09.14 21:26
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, artelk, Вы писали:


EP>>>// await is not limited by "one level" as in C#

A>>Всмысле?

EP>Функция foo вызывает bar. В C# пришлось бы ставить async на bar, а тут нет. То есть вызов await может находится на какой угодно глубине, в отличии от C# (где это возможно только в пределах async методов).

EP>Это позволяет, например, взять обычный синхронный код, передать ему объекты-stream'ы с await'ом внутри — и всё заработает без изменений.
EP>http://rsdn.ru/forum/philosophy/5206735.1
Автор: Evgeny.Panasyuk
Дата: 21.06.13


Кстати, спорное преимущество. Вот вызываешь ты с виду безобидную функцию, а она фигакс и унутрях переключается на другой поток, а все твои thread locals оставляет в предыдущем. Например, errno.
Re[12]: cppcms
От: Хон Гиль Дон Россия  
Дата: 25.09.14 21:36
Оценка: +1
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Ты пытаешься доказать, что допустить RCE в C#-коде не сложнее, чем в C++? Смешно, шутку оценил


Пока не пытался, но мысль интересная. Особенно если вспомнить, дырка в программе на С++ — это дырка в одной программе, а дырка в .net фреймворке (кои находят регулярно) — это дырка в куче разных программ. С каким коэффициентом масштабировать будем?
Да, и при этом почему-то никого не удивляет написание веб-софта на приколоязыке PHP, не слышно отчего-то возмущенных возгласов. А C++, о ужас, небезопасный.


KV>Я также не вижу смысла и в обсуждении проблем чужого восприятия.


Ну да, и так понятно что ты фигню ляпнул.



KV>По ссылке, от которой ты так упорно отбрыкиваешься, приведены десятки примеров атак на реальные приложения через специально сформированные unicode-строки.


Осталось выделить из них атаки собственно через utf-8. Чтобы отсечь, например, типичные проблемы с интерпретацией UTF-16 как UCS-2.

ХГД>>Меня, собственно, удивило, почему ты их назвал "лишними телодвижениями"


KV>Потому что в коде на управляемом языке их совершать не нужно.


Что именно не нужно совершать на управляемом языке? Вот написано, например "не используйте кодировок кроме utf-8 без острой необходимости" — где здесь лишнее по сравнению с PHP телодвижение?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[40]: cppcms
От: Ночной Смотрящий Россия  
Дата: 25.09.14 21:44
Оценка:
Здравствуйте, alex_public, Вы писали:


НС>>Я не понимаю пример чего ты там показал.

_>Это пример сохранения в БД экземпляра класса, написанного не нами (и не созданного изначально для прямого отображения в БД).

Зачем сохранять в БД класс, который для этого не предназначен? Впрочем, неважно, я тебе код привел, который вообще никаких классов не требует.

_> У него есть как необходимые для сохранения/востановления поля (которые мы и кладём в табличку), так и инициализируемые им самим (и нужные для дальнейшей работы).


Доблесть то в чем? И в чем проблема с этим у линка?
db.Persons.Insert(new {extPersonID, extPerson.Name, extPerson.Total});


_>Нет, я хочу увидеть работу с уже существующим классом.


Какую работу? Вставку данных из какого то источника? Ты правда думаешь что у линка с базовым сценарием какие то проблемы? Или тебе интересно, можно ли к внешнему классу навесить метаданные? Можно. Но не нужно.

_> Сохранение/выгрузку части его полей.


Это тоже базовый сценарий.

_>Вроде как абсолютно тривиальная задача


Тогда накой черт ты ее сюда притащил?

_>, которая вполне может возникнуть в случае использования сторонних библиотек (и необходимости сохранения состояния объектов оттуда).


В 10 раз — сама формулировка "сохранение состояний" при работе с РСУБД — прекрасный способ прострелить себе ногу. Никогда так не делай. Работа с БД должна быть отдельно, а какие то классы, у которых совсем другое назначение — отдельно. SRP здесь особенно важен.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.