Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46

Подскажите элегантный подход

24.12.2013, 23:29. Показов 980. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Предлагаю пример моей реализации. Далее попрошу дать совет по улучшению.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        interface ISaveRead
        {
            public void Save(BinaryWriter bw);
            public void Load(BinaryReader br);
        }
 
        public class ClassA:ISaveRead
        {
            // поля
            int a;
            double b;
 
            /// <summary>
            /// [Описание свойства А]
            /// </summary>
            public int A {get{ return a; } }
            /// <summary>
            /// [Описание свойства В]
            /// </summary>
            public int B {get{ return b; } }
 
            /// <summary>
            /// конструктор. (Единственный)
            /// </summary>
            /// <param name="a_"> [Описание свойства А ]</param>
            /// <param name="b_"> [описание свойства B ] </param>
            public ClassA(int a_,double b_)
            {
                  a=a_;
                  b=b_;
            }
 
            public void Save(BinaryWriter bw)
            {
                  bw.Write(a);
                  bw.Write(b);
            }
            public void Load(BinaryReader br)
            {
                  a=br.ReadInt32();
                  b=br.ReadDouble();
            }
        }
Схема работы
  • Каждому полю обязательно соответствует аналогичное свойство для чтения
  • Конструктор ЕДИНСТВЕННЫЙ, в параметрах конструктора передаются значения ВСЕХ полей
  • При сохранении в файл значение КАЖДОГО поля записывается
  • При чтении значение КАЖДОГО поля считывается

Вот моменты, которые я хотел бы оптимизировать, если возможно:
  1. возможно ли прописать [описание свойства X] только один раз?
    в моем варианте прописывается в описании свойства и в конструкторе
  2. Если я решу добавить поле "C", то в соответствии со схемой работы придется добавить:
    - Свойство для чтения поля
    - Описание свойства
    - Параметр в конструктор "c_", описание к параметру
    - Строчку в конструктор " c = c_; "
    - Добавить строчку в метод Save() "bw.Write(c);"
    - Добавить строчку в метод Read() "c = br.Read();"
    И ДЛЯ ЛЮБОГО ПОЛЯ ДЕЙСТВИЯ БУДУТ ВСЕГДА ТАКИМИ ОДИНАКОВЫМИ
  3. таких классов как "ClassA" достаточно много (~20), и все по тому же принципу, только с другими полями
как то сложновато


ЗАЧЕМ ВСЕ ЭТО?
Как вы наверно поняли, эта конструкция служит только для цели:
1. Сохранить в файл набор параметров (с возможностью чтения)
2. Выполнять запросы с группой объектов, обращаясь к полям
Например
C#
1
2
3
4
5
6
 List<ClassA> aList;
 
public double getSumBWhereBigA(int min_A)
{
    return aList.Sum(o=> o.A > min_A ? o.B : 0 );
}
очень удобно


НЕЧЕГО ГОРОДИТЬ ОГОРОД, СУЩЕСТВУЕТ ENTITY FRAMEWORK! ! !
ну а если всё - таки хочется, м?

Помогите советом. Если нужно, в ответ помогу финансово.

Добавлено через 1 час 22 минуты
P.S. Данную задачу можно рассмотреть как задачу кодогенерации T4. Но степень элегантности может сильно варьироваться. Я, например, ни разу ни пользовался T4. Если что сам напишу - выложу
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2013, 23:29
Ответы с готовыми решениями:

Подскажите подход к решению
Добрый вечер. Есть задача из книги Страуструпа для начинающих. Решение должно быть реализовано на основе библиотеки FLTK и написанных...

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

Подскажите алгоритм или подход к решению
Есть достаточно большое поле. На поле заданны &quot;входные&quot; и &quot;выходные&quot; клетки. Также даны тесты - тройки вида (входные значения, выходные...

7
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.12.2013, 03:40
Mishutka, ну как минимум, чтобы не делать поля, элементарно можно сделать

C#
1
public int A {get; private set;}
получаем свойства, изменять которые можно только изнутри класса.

насчет автоматического сохранения-загрузки - элементарно, помечаем класс как 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  [ТС]
Спасибо за ответы.
P.S. И причем тут EntityFramework?
Я упомянул про EF, потому что с его помощью можно было бы сильно оптимизировать код:
Пишу моедль данных, а сохранение и запись на ЖД система сделает автоматически. Самое главное, изменени модели данных практически никак не влияет на ход процесса .
помечаем класс как Serializable-XmlType
Спасибо. Мне просто лень разбираться как работает серилизация, так как мой предидущей опыт подсказывает, что она сохраняет много ненужной (мне) информации. Возможно, при при большом объеме экземпляров этот фактор становится минимальным, но опять же, не знаю почему, люблю руками писать Write(a); a = ReadInt(); так как знаю, сколько байт это займет. И не байта больше. Уж откуда во мне такая скупость? Наверно с тех времен, когда пользовались дискетами и каждый килобайт был на счету.

Dynamic Source Code Generation and Compilation.
Я склоняюсь к этому решению. Люблю изучать принципиально новые подходы. Даже если "овчинка не стоит выделки", получаю порцию приятных ощущений от нового опыта в программировании.

Стоит пересмотреть структуру? Может лучше использовать что нибуть типа Dictionary<string,object> как хранилище данных?
Вчера ночью прокручивая в голове варианты решения, пришел к этому же выводу. Отошел окончательно от предыдущей структуры, но в голове мелькают несколько фантазий, кажущихся мне просто гениальными по сравнению с первым наброском.

Прошу развеять мысли об утопичности идеи, и подсказать какими инструментами нужно пользоваться.
Новая задача
пока задача чисто: что дано, что получить
Дано:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Logic
{
  int a;
  double b;
  ...
  int GetC(a);
 
 
  public Result Solve()
  {
      if( a > 3 )
         return SimpleSolve();
      else 
         return HardSolve();
  }
  
  Result SimpleSolve()
  {
      return Result.SomeResult_1(GetC(a));
  }
 
  Result HardSolve()
  {
      double x =  GetX(a,b,GetC(a),"строка");
 
      if( b+GetC(a) > 5*x) 
         return Result.SomeResult_2(x);
      return Result.SomeResult_3;
  }
}
Хочу получить:
Словами
Сохранить весь "путь" логики начиная от вхождения в функцию Solve() до возвращения результата из этой функции для каждого вызова функции Solve().
То есть, в текстовом варианте:

Новый вызов № 1
- Параметр a = 4
- Работа функции SimpleSolve()
- GetC(a) = 4
- конец работы алгоритма. Результат Result = тому то
Новый вызов № 2
- Параметр a = 2
- Работа функции HardSolve()
// Для того, чтобы вызвать функцию GetX(..) нужно знать параметры.
- параметр b = 8.223
- GetC(a) = 4
- GetX(...) = 5.4
- конец работы алгоритма. Результат = тому то
. . .
Сохранение же на жеский диск данного пути должно сгенерироваться следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Вызов № 1
BinareWriter bw;
 
bw.Write(a);
Bw.Write(I_m_IN_SIMPLE_SOLVE_FUNCTION);
bw.Write(GetC(a));
bw.Write(Result);
 
// Вызов № 2
 
bw.write(a);
bw.Write(I_m_IN_HARD_SOLVE_FUNCTION);
bw.write(b);
bw.write(GetC(a));
bw.write(GetX(a,b,GetC(a)));
bw.write(Result);
Делается это для того, чтобы аналогичным образом можно было СЧИТАТЬ эту информацию из файла в некоторую модель данных. Эта модель тоже по идее генерируется из того, что дано.

Таким образом, имея множество записей, могу АНАЛИЗИРОВАТЬ собственный код!
Например
C#
1
2
3
4
5
6
7
8
9
10
11
List<GeneratedDataModel> list;
...
public int Сколько_Раз_Вызывалась_Функция_SimpleSolve()
{
  return list.Sum(a=> a.Contains(I_M_IN_SIMPLE_SOLVE_FUNCTION) ? 1 : 0);
}
 
public int Какое_Максимальное_Значение_Было_У_Параметра_Х()
{
  return list.Max(a => a.Contatins(I_M_IN_HARD_SOLVE_FUNCTION) ? (a as HARD_SOLVING).x : 0 );
}
Немного запутался пока писал. . .
Скажу словами: Я хочу, чтобы в результате работы функции, записывался каждый её шаг (точнее каждый операнд в любой операции) Каждый поворот алгоритма (вызов функции, операторы 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
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
25.12.2013, 17:21
Я использую вот такой подход:

Объявляется интерфейс данных

C#
1
2
3
4
5
public interface IContract
    {
        int X { get; set; }
        int Y { get; set; }
    }
После используя технические интерфейсы

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface IObject
    {
        void SetState(Hashtable hashtable);
        void SetState(DataRow dataRow);
        void SetState(DbDataReader dbDataReader);
        Hashtable GetState();
    }
 
    public interface IDataTableWork
    {
        DataTable GetTable();
        void FillRow(DataRow dr);
    }


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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
internal class Contract : IContract, IDataTableWork, IObject
    {
        #region Implementation of IContract
 
        private int _x;
 
        private int _y;
 
        public int X
        {
            get { return _x; }
            set { _x = value; }
        }
 
        public int Y
        {
            get { return _y; }
            set { _y = value; }
        }
 
        #endregion
 
        #region Implementation of IDataTableWork
 
        public DataTable GetTable()
        {
            var dt = new DataTable("IContract");
            dt.Columns.Add(new DataColumn("X", typeof (int)));
            dt.Columns.Add(new DataColumn("Y", typeof (int)));
            return dt;
        }
 
        public void FillRow(DataRow dr)
        {
            dr["X"] = _x;
            dr["Y"] = _y;
        }
 
        #endregion
 
        #region Implementation of IObject
 
        public void SetState(Hashtable hashtable)
        {
            if (hashtable["X"] != null)
                _x = (int) hashtable["X"];
            if (hashtable["Y"] != null)
                _y = (int) hashtable["Y"];
        }
 
        public void SetState(DataRow dataRow)
        {
            if (dataRow.Table.Columns.Contains("X") && dataRow["X"] != null)
            {
                _x = (int) dataRow["X"];
            }
            if (dataRow.Table.Columns.Contains("Y") && dataRow["Y"] != null)
            {
                _x = (int) dataRow["Y"];
            }
        }
 
        public void SetState(DbDataReader dbDataReader)
        {
            int ordinalIndexByDataReader = dbDataReader.GetOrdinal("X");
            if (ordinalIndexByDataReader == -1 && !dbDataReader.IsDBNull(ordinalIndexByDataReader))
            {
                _x = dbDataReader.GetInt32(ordinalIndexByDataReader);
            }
            ordinalIndexByDataReader = dbDataReader.GetOrdinal("Y");
            if (ordinalIndexByDataReader == -1 && !dbDataReader.IsDBNull(ordinalIndexByDataReader))
            {
                _y = dbDataReader.GetInt32(ordinalIndexByDataReader);
            }
        }
 
        public Hashtable GetState()
        {
            var hashtable = new Hashtable {{"X", _x}, {"Y", _y}};
            return hashtable;
        }
 
        #endregion
    }
Если надо сохранить кучу коллекций в (например) xml используется DataSet и в него соответственно запихиваются все DataTable, чтение так же. Если необходимо заполнить объект из БД, юзаем свои методы. Если необходимо передать объект(ы) по сети (WCF) другому клиенту, создаем свой сериализатор в нем сериализуем Hashtable и серверу по сути не обязательно знать о классах как таковых, т.е. он просто выступает посредником. Ну и плюсом куча еще всякой полезной функциональности.
1
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46
26.12.2013, 00:12  [ТС]
Спасибо еще раз за ответы. Мне понядобяться дни, недели или может месяцы чтобы изучить те инструменты, которые вы мне советуете. Но я все же предприму еще одну попытку поставить четкую задачу.
Очень тяжело рекомендовать не видя начальной задачи. Всегда есть как минимум два решения
Согласен, начальная задача важна.

Итак, я пишу бота для игры в покер. (в прочем, не важно для чего. Задача подходит для ЛЮБОГО бота). Мне нужна система анализа моего алгоритма.
Итак. поконкретней. Как только наступает ход моего бота, он вызывает начальную функию BotResult Solve(). В общем, приведу небольшой пример (упрощенный вариант, код написал для примера)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class BotLogic
{
 BetRounds betRound;
 
...
 
 public BotResult Solve()
 {
    switch(betRound)
    {
      case BetRounds.Preflop: return PreflopSolve();
      case BetRounds.Flop: return FlopSolve();
      ...
    }
    return BotResult.Fold;
}
 
BotResult PreflopSolve()
{
  if(position == Positions.LatePosition && limps == 0 && raisers == 0)
    return DoSteal();
 if(limps == 0 && raisers ==0)
    return OpenRaise();
 ...
  return BotResult.Fold;
}
 
//кража блайндов
BotResult DoSteal()
{
  // определяем вероятность того, что оппоненты после нас (на блайндах) сбросят карты на наш рейз
  double prob = GetProbability(double FoldToStealFirst,double FoldToStealSecond);
  // определяем вероятность выигрыша нашей руки если один из опоонентов сделает ре-рейз
  double eq = CalculateEquity(OurHand,RestealFirst,RestealSecond);
  // считаем выгоду действия
  double EV = (размер_блайндов) * prob + (1 - prob) * (eq * allinpot - bet) ;
  if(EV > 0)
      return BotResult.Raise(OurBet);
  return BotResult.Fold;
}
 
BotResult OpenRaise()
{
  if(position !=  Position.LP)
    if(OurHand == AA || OurHand == KK)
      return BotResult.Raise(OurHand);
 return BotResult.Fold
}
...
Как то так. Теперь самое интересное. Данный алгоритм вполне будет работать. Но куда более интересный вопрос: как эффективно работает КАЖДАЯ ЧАСТЬ алгоритма. Посмотрим на первую функцию Solve(). Мне интересно, как работают функции PreflopSolve и FlopSolve() по-отдельности. Далее, смотрим Preflop. Я хочу ответить на вопросы:
1) как часто я находился в позиции для кражи блайдов (вызов DoSteal)
2) как часто я воровл блайнды (результат DoSteal() == Raise)
3) Сколько денег я "наворовал" (у каждой раздачи есть поле, сколько я выиграл в результате)
4) Какой процент прибыльных (для меня) раздач я сыграл воруя блайнды, когда расчетный выигрыш EV > 0.10?
...
Таких вопросов я могу придумать сотни. И они все РЕАЛЬНО полезные для анализа моего алгоритма на основе десятков и сотен тысяч сыграных раздач

Поэтому ИЗНАЧАЛЬНАЯ ЗАДАЧА:
придумать такую волшебную штуку, которая из кода логики сохраняет все пути сыгранных раздач, все значения параметров, используемых в алгоритме, некоторые выбранные промежуточные показатели (например, EV), да ещё так, чтобы можно было писать запросы ко всем сыгранным рукам.

По другому, я хочу писать всю информацию в лог-файл, но так структурированно, что получая доступ к каждой ситуации в алгоритме СРАЗУ ПО ВСЕМ раздачам.

Еще один момент все переменные, к которым есть доступ в алгоритме, ПОСТОЯННЫЕ. Т.е. пока выполняется начальная ф-ия Solve, никакие из доступных переменных не меняются. (кроме локальных) Все функции (например расчет эквити (CalculateEquity) дают ВСЕГДА один результат на одних и тех входных данных.
Таким образом на данных, извлеченных из файла для любой раздачи, получим всегда ТОТ ЖЕ результат, что и в процессе выполнения.

Переменные, от которых зависит какой дальнейший путь алгоритма, назовем УПРАВЛЯЮЩИМИ. В примере выше к ним относятся: betRound,position, limps,raises, EV, OurHand
Промежуточные переменные служат для вычисления УПРАВЛЯЮЩИХ. В примере выше: eq, prob.
Управляющими ФУНКЦИЯМИ назовем все функции, у которых возвращаемый тип BotResult.

Сформировалось требование:
  1. на жеский диск сохраняются ОБЯЗАТЕЛЬНО ТЕ и ТОЛЬКО ТЕ управляющие переменные, к которым в процессе работы алгоритма идет обращение (притом второй раз нес охраняем, т.к. они постоянные в процессе работы Solve())
  2. По желанию могут сохраняться неуправляющие переменные
  3. Сохраняются обязательно вызовы всех УПРАВЛЯЮЩИХ функций. То есть если в процессе алгоритма была вызвана функция DoSteal, то на жеский диск сохраняется некий флаг, что данная функция была вызвана. Также записывается результат функции.
Таким образом, мы получаем возможность ПОЛНОСТЬЮ ВОССТАНОВИТЬ сыгранную раздачу и получить тот же результат. Получаем возможность проанализировать работу конкретной функции.


Задача 2. Работа с массивом сохраненных данных
Получили все необходимые данные, но как с ними работать сразу по всем раздачам?
Хотелось бы иметь следующий доступ: (для тех вопросов, что я описал в начале)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<razdazha> list();
 
...
//0) Сколько раз я выиграл на флопе?
return list.Sum(a=> a.Contains(Postflop_)  ? a.RESULT_MONEY > 0 ? 1 : 0:0);
 
//1) сколько раз я находился в позиции для кражи блайдов (вызов DoSteal)
return list.Sum(a=> a.Contains(Do_Steal) ? 1 : 0);
 
//2) как часто я воровл блайнды (результат DoSteal() == Raise)
return list.Sum( a => a.Contains(Do_Steal) ? (a.Get(Do_Steal).Result == BotResult.Raise ? 1 : 0: 0) / < поделить на пункт выше>
 
//3) Сколько денег я "наворовал" (у каждой раздачи есть поле, сколько я выиграл в результате)
return list.Sum( a => a.Contains(Do_Steal) ? a.RESULT_MONEY : 0) 
 
4) Какой процент прибыльных (для меня) раздач я сыграл воруя блайнды, когда расчетный выигрыш EV > 0.10?
return list.Sum( a => a.Contains(Do_Steal) ?  a.Get(Do_Steal).EV > 0.10 ? a.RESULT_MONEY > 0 ? 1 : 0 :0:0) / <аналогично количество всех раздач, где .EV > 0.10>
Как вы видите, я предполагаю, что для каждой функции в алгоритме, существует некий класс, поля которого содержат информацию об управляющих элементах ВНУТРИ данной функции. Т.е. для класса Postflop_ из примера поля будут:
position
limps
raises
для класса Do_Steal:
prob (при желании)
eq (при желании)
EV (обязательно)

Спасибо, что хватило терпения дочитать! (если только не пролистали к итогу )

P.S. Пока подробно писал, что и как должно работать, в голове начала рисоваться картинка, что к чему. Поэтому спасибо тем, кто отвечал на мои посты! Даже если я не прислушался к вашему совету, мне помогло то, что вы сподвигли меня разобраться подробней в своей задаче!

P.P.S. это не означает, что я не ценю содержимое ответа
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
26.12.2013, 01:52
Mishutka, возможно, есть смысл изменить switch case на полиморфизм, то есть ввести классы PerfolopSolver, FlopSolver и пр, отнаследовать их от интерфейса ISolver или абстрактного класса HoldemSolver, можно ввести для него какое-нибудь поле типа calls, тогда:
C#
1
2
3
4
//Сколько раз я выиграл на флопе?
return BotLogic.FlopSolver.Count(x=> x.Result == ResultEnum.Win);
//Сколько денег я "наворовал" (у каждой раздачи есть поле, сколько я выиграл в результате)
return BotLogic.Sum(x => x.Gain);
что-то в таком духе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2013, 01:52
Помогаю со студенческими работами здесь

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

Подскажите, правильно написана разметка. Интересует правильно ли используется подход БЭМ?
&lt;section class=&quot;partners&quot;&gt; &lt;div class=&quot;container&quot;&gt; &lt;h2 class=&quot;partners__title&quot;&gt;Meet a partner for your best...

Использовать массивы или есть более элегантный способ?
Пишу игру. Есть предметы которые выпадают из монстров. Например: золото, аптечка, автомат и т.д. У каждого предмета есть шанс его...

Есть ли более правильный и элегантный способ реализации функции?
Доброе время форумчане! bool db::CreateSQLTable() { QSqlQuery a; QString str = &quot;CREATE TABLE &quot;SortFiles&quot;...

Найти самый элегантный путь для логирования. Возможно с использованием паттернов
Здравствуйте! Нужно придумать красивый и элегантный способ логирования некоторых функций, внутри трех классов. Идеально, чтобы принцип...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru