D vs C++
    , почти сурковская пропаганда: не пора ли C++ потихоньку готовиться к пенсии?
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Правила раздела:
  | Страницы: (56) « Первая ... 14 15 [16] 17 18 ... 55 56 ( Перейти к последнему сообщению ) | 
    D vs C++
    , почти сурковская пропаганда: не пора ли C++ потихоньку готовиться к пенсии?
  | 
         
         
         
          
           Сообщ.
           #226
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @  Зачем что-либо говорить ради что-либо сказать? Я посмотрел, даже понял, как работает, ожидания подтвердились. Вообще, кто-то просил сериализацию, получил сериализацию, но ни одного комментария на эту тему так и не сделал. Добавлено Я даже примерно представляю как. Это даже скорее не ошибка, а просто плохо задокументированная инструкция по применению. Но так, как я это представляю, будет неудобно, и вот сие улучшить было бы неплохо.  | 
    
| 
         
         
         
          
           Сообщ.
           #227
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата jack128 @  прикольно. то есть если бы ты писал excel, то у тебя бы документ представлял бы собой такую вот огромную структуру с открытыми полями? А ты считаешь, что во всех задачах можно использовать один и тот же подход? У меня нет «огромных структур», все довольно небольшие. Впрочем, может быть так оно и было бы, а в чем проблема?  | 
    
| 
         
         
         
          
           Сообщ.
           #228
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата korvin @  Цитата MyNameIsIgor @  Погоди, plain data - это детали реализации. Если ты выставил их наружу так, что их видит библиотека сериализации, то я уже считаю это ошибкой проектирования.  Ты вообще о чем? У меня просто в тех местах, где требуется маршалинг/демаршалинг, нет «объектов» с закрытыми полями, только структуры с открытыми. Гмм... Как это выглядит в жизни? Т.е. пример бы какой-нибудь.  | 
    
| 
         
         
         
          
           Сообщ.
           #229
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата MyNameIsIgor @  Гмм... Как это выглядит в жизни? Ну например беру из базы нужные записи(структуры) и на их основе создаю новую структуру (с другими полями) или массив структур и отправлю ее/их по HTTP клиенту. То же самое и в обратном порядке. Сам сервис никаких «объектов с состоянием» не имеет, всё состояние в записях БД. Т.е. всё больше в функциональном стиле.  | 
    
| 
         
         
         
          
           Сообщ.
           #230
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата korvin @  Ну например беру из базы нужные записи(структуры) и на их основе создаю новую структуру (с другими полями) или массив структур и отправлю ее/их по HTTP клиенту. То же самое и в обратном порядке. Так вместо функций сериализации каждого типа у тебя есть функции преобразования данных, полученных от модуля взаимодействия с БД, в данные, пригодные для простой сериализации. Так какая разница?  | 
    
| 
         
         
         
          
           Сообщ.
           #231
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата MyNameIsIgor @  Так вместо функций сериализации каждого типа у тебя есть функции преобразования данных, полученных от модуля взаимодействия с БД, в данные, пригодные для простой сериализации. Так какая разница? Разница в том, что функции обработки мне нужны в любом случае, это не просто «преобразование данных», а некоторая бизнес-логика. В простых случаях этих функций нет и данные напрямую передаются клиенту и обратно, безо всякой обработки. Так зачем мне еще описывать функции сериализации/десериализации для каждого типа?  | 
    
| 
         
         
         
          
           Сообщ.
           #232
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          А обязательно для каждого? Разве нельзя описывать только исключения, для остальных предложив единый метод?   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #233
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Qraizer @  А обязательно для каждого? Разве нельзя описывать только исключения, для остальных предложив единый метод? Ну так у меня так и получается, только в этих «исключительных» случаях вместо одной большой структуры с данными для БД и данными для клиента используются две небольшие структуры — одна для БД, другая для клиента.  | 
    
| 
         
         
         
          
           Сообщ.
           #234
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Вспомнил про затихший холиворчик. Продолжу продвижение D. 
        
      Функция должна вернуть несколько значений, и хочется чтобы доступ к значениям был бы как к полям структуры, а не по индексу, как в обычном плюсовом кортеже. Вот эта маленькая магия сама объявляет структуру с полями названными как переменные переданные в параметры и заполняет ее значениями из этих же переменных. Структура объявляется внутри функции (кстати, а плюсы так умеют?), а значит не гадит в глобальную область видимости. Рекурсивный миксин плюс немножко статической рефлексии. Дешево, сердито и красиво, плюсики так не умеют и вряд ли когда сумеют: http://dpaste.dzfl.pl/d09ce6ded86b ![]() ![]() template packTuple(ARGS...) {     template Decls(alias value, ARGS...) {         mixin("typeof(value)" ~ __traits(identifier, value) ~ ";");         static if(ARGS.length) mixin Decls!ARGS;     }     struct Tuple {         mixin Decls!ARGS;     }     auto packTuple() { return Tuple(ARGS); } } auto foo() {     int fieldInt = 10;     string fieldString = "test";     return packTuple!(fieldInt, fieldString); } void main() {     auto result = foo();     assert(result.fieldInt == 10);     assert(result.fieldString == "test"); }  | 
    
| 
         
         
         
          
           Сообщ.
           #235
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @   Уметь-то умеют, но эта структура будет видна только внутри этой функции, так что выдать её в качестве результата не получится, поскольку в точке вызова она не будет существовать.Структура объявляется внутри функции (кстати, а плюсы так умеют?) Хотя, возможно auto может создать безымянный тип, соответствующий этой структуре, и получится использовать его.  | 
    
| 
         
         
         
          
           Сообщ.
           #236
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата amk @  Конечно с auto. Без auto и в D невозможно. ЕМНИП в след версии плюсов, появился полноценный auto, а не инвалид который есть в C++11. 	 Хотя, возможно auto может создать безымянный тип, соответствующий этой структуре, и получится использовать его.   | 
    
| 
         
         
         
          
           Сообщ.
           #237
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          А что такого инвалидного в С++ auto?   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #238
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата amk @  Опять же, ЕМНИП, там запутанный и неприятный синтаксис для auto - возвращаемых типов. Просто вот так написать не получится:А что такого инвалидного в С++ auto? ![]() ![]() template<typename A, typename B> auto foo(A a, B b) {   return a + b; } Добавлено Кстати еще вот некоторым не нравится, что в D для объявления шаблонов используются круглые скобки. А мне вот, наоборот, нравится, благодаря этому, инстанцирование шаблона выглядит похожим на вызов функции.  | 
    
| 
         
         
         
          
           Сообщ.
           #239
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Да, выглядит как недоделка. Если над объекты типов A и B можно сложить, то тип результата а этой точке известен, значит ничего не должно мешать и определению типа возвращаемого значения.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #240
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата amk @  Это возможно, но вот таким странным образом:Да, выглядит как недоделка. Если над объекты типов A и B можно сложить, то тип результата а этой точке известен, значит ничего не должно мешать и определению типа возвращаемого значения.  ![]() ![]() template<typename A, typename B> auto hellSum(A a, B b) -> decltype(a + b) {   return a + b; }  |