Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
dailydose
656 / 204 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
#1

Проектирование (разработка логики приложения): как это делать правильно? - C++

28.09.2016, 16:33. Просмотров 324. Ответов 10
Метки нет (Все метки)

Добрейшего времени суток.

Зачастую при решении разных задач возникают проблемы с архитектурой приложений. А именно при получении задачи я сразу же берусь за написание кода, от этого и много проблем и ошибок разного рода, и как следствие приходится многое переписывать/передумывать. Недостатки этого недоподхода очевидны, да и к тому же затратны по времени.

Собственно вопрос -- как бороться с этим недугом? Где можно что почитать? До "Совершенный код" Макконнелла руки пока не доходят, постоянно откладываю на потом, да и думаю пока еще рано за эту книгу браться.
http://www.cyberforum.ru/cpp-beginners/thread356266.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2016, 16:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проектирование (разработка логики приложения): как это делать правильно? (C++):

не могу понять как это делать
Даны целые числа n , a0 , a1, a2 , …, an−1. Найти сумму всех членов...

Поясните с массивами, как делать это задание
1. Дана последовательность натуральных чисел а1, a2, ..., а20. Определить, есть...

Как делать оконные приложения C++
Извините за ламерский вопрос, но всё же, кто как делает оконные приложения на...

джойнер что это за зверь и как его делать
Всем привет, объясните пожалуйста как работает джойнер, по какому принципу, как...

Одномерный массив(кто знает? как это делать?)
Задача такая Заполнить случайными целыми числами в диапозоне 0 до 10 и вывести...

10
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.09.2016, 11:23 #2
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от dailydose Посмотреть сообщение
Собственно вопрос -- как бороться с этим недугом? Где можно что почитать? До "Совершенный код" Макконнелла руки пока не доходят, постоянно откладываю на потом, да и думаю пока еще рано за эту книгу браться.
Ну почему же, Макконнелл как раз своевременно и в тему. Конечно, он отпугивает своей толщиной, и воды в нем многовато, но его нужно читать выборочно.
"Чистый код" Роберта Мартина тоже очень хорошая книга.
Цитата Сообщение от dailydose Посмотреть сообщение
при получении задачи я сразу же берусь за написание кода, от этого и много проблем и ошибок разного рода, и как следствие приходится многое переписывать/передумывать.
Ну, вы наверно сразу с реализации начинаете, т.е. снизу вверх, а надо с проектирования начинать, т.е. сверху вниз.
Кстати, Роберт Мартин приводит очень простой и эффективный способ:
1) В функции main сначала пишете комментарий, в котором рассказываете что она должна делать.
2) Затем каждое действие заменяете вызовом функции, которую и называете по имени этого действия.
3) Далее реализуете эти функции таким же способом.
Т.е. сначала добиваетесь, чтобы функция main выглядела красиво, потом приступаете к реализации вызываемых в ней функций. Таким образом и код получается самодокументируемым, и проектирование само собой происходит.
1
hoggy
Заблокирован
29.09.2016, 15:38 #3
Цитата Сообщение от dailydose Посмотреть сообщение
как бороться с этим недугом?
Цитата Сообщение от dailydose Посмотреть сообщение
До "Совершенный код" Макконнелла руки пока не доходят
тогда - страдать.
1
dailydose
656 / 204 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
29.09.2016, 15:52  [ТС] #4
Цитата Сообщение от Mr.X Посмотреть сообщение
Роберт Мартин приводит очень простой и эффективный способ:
я сам как-то пришёл к похожему способу, например.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
void PrintMenu();
void HanldeMenu(short item);
 
int main(int argc, char** argv)
{
    PrintMenu();
    return 0;
}
 
void PrintMenu()
{
    std::cout << "Вывожу пункты меню:1 2 3 4 8 9 0" << std::endl;
    short item;
    HandleMenu(item);
}
 
void HanldeMenu(short item)
{
    std::cout << "Выбран пункт №" << item << std::endl;
    // далее тут switch-case, etc...
}
т.е. так же разбиваю на функции, и обычным cout вывожу на экран сообщение, дабы удостовериться что попал в нужную функцию.

Mr.X,
а вообще с какой книге посоветуете сейчас начать?
мой архивчик :)
Дональд Кнут - искусство программирования
Джоэл Спольски - Джоэл о программировании
Роберта Мартина «Чистый код»
Мартин Фаулер - Рефакторинг. Улучшение существующего кода
Макконнелл - Совершенный код. Мастер-класс

шаблоны проектирования алан шаллоуей Джеймс р Тротт
Design Patterns, шаблоны Фаулера

Гради Буч: Объектно-ориентированный анализ и проектирование
Приемы объектно-ориентированного проектирования - Э. Гамма

Интерфейс: новые направления в проектировании компьютерных систем
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.09.2016, 17:45 #5
Цитата Сообщение от dailydose Посмотреть сообщение
а вообще с какой книге посоветуете сейчас начать?
Ну, из этих книг мне "Чистый код" больше всего нравится. Умно и толково пишет о самых важных вещах и особо не растекается мыслью по древу.
1
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
29.09.2016, 18:42 #6
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от dailydose Посмотреть сообщение
Собственно вопрос -- как бороться с этим недугом?
Бери листик, ручку (условно) и описывай для себя, как будет работать
твоя программа, по какой схеме. Тут то, тут се, там это. Обычно сразу всплывают
какие-то загвоздки, которые тебе в ином случае пришлось бы решать уже "на ходу".
Когда наступит полная или почти полная ясность, можешь садиться и писать код.
1
dailydose
656 / 204 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
29.09.2016, 21:20  [ТС] #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Бери листик, ручку (условно) и описывай для себя, как будет работать
твоя программа, по какой схеме.
Как-то раз пришла идея сделать тупенький аймбот. Для начала задача была простая, с возможностью дальнейшего оброста функционала.

Пример испытвал на CS:GO, причём удачно.

Суть проста:
1. караулим врага где-нибудь у арочки/дверей с зажатой клавишей hotkey1
2. как только враг появляется сразу зажимаем мышку1 для выстрела
3. клавишу hotkey1 отпускают -- отпускаем мышку1 (прекращение стрельбы)
Вообще хорошо было бы для перестрелок на снайперских винтовках. Например de_dust2 на центре
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// stupid aimbot v1.0
#define hotkey1 ALT
while(true)
{
    if(зажата клавиша hotkey1)
    {
        //враг появился
        if(цвет пикселя изменился)
        {
            зажать_mouse1();
        }
    }
    // клавишу отпустили
    else
    {
        отпустить_mouse1();
    }
}
и вот во что это превратилось
main.cpp
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
#include "Mouse.h"
#include "Color.h"
 
int main(int argc, char* argv[])
{
    Color prev, current;
    Mouse m(1);
 
    while (true)
    {
        if (GetAsyncKeyState(VK_F8) & 0x8000)
        {
            if (m.holded)
            {
                Sleep(100);
                continue;
            }
            current.GetRGB();
 
            if (!current.IsEqual(prev))
            {
                // "enemy detected"
                m.HoldButton();
            }
            prev = current;
        }
        else
        {
            if (m.holded)
            {
                m.ReleaseButton();
            }
            prev.Reset();
        }
        Sleep(100);
    }
    return 0;
}

Mouse.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#ifndef MOUSE_H
#define MOUSE_H
 
#include <windows.h>
 
class Mouse
{
public:
    bool holded;
 
    Mouse(short btn) : holded(false), button(btn), input({ 0 }) {}
    ~Mouse() {}
 
    void HoldButton();
    void ReleaseButton();
 
private:
    short button;
    INPUT input;
};
 
#endif

Mouse.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Mouse.h"
 
void Mouse::HoldButton()
{
    holded = true;
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = (button == 2 ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_LEFTDOWN);
    ::SendInput(1, &input, sizeof(INPUT));
}
 
void Mouse::ReleaseButton()
{
    holded = false;
    ::ZeroMemory(&input, sizeof(INPUT));
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = (button == 2 ? MOUSEEVENTF_RIGHTUP : MOUSEEVENTF_LEFTUP);
    ::SendInput(1, &input, sizeof(INPUT));
}

Color.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#ifndef COLOR_H
#define COLOR_H
 
class Color
{
public:
    Color();
    ~Color() {}
    bool IsEqual(Color &subject);
    void Reset();
    void GetRGB();
 
private:
    short r, g, b;
};
 
#endif

Color.cpp
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
#include "Color.h"
#include <windows.h>
///
#include<iostream>
 
Color::Color()
{
    Reset();
}
 
void Color::Reset()
{
    r = -1;
    g = -1;
    b = -1;
}
 
bool Color::IsEqual(Color &subject)
{
    return (r == subject.r
        && g == subject.g
        && b == subject.b) || subject.r == -1;
}
 
void Color::GetRGB()
{
    static POINT pos;
    static HDC hdcScreen;
    static COLORREF pixel;
 
    GetCursorPos(&pos);
    hdcScreen = ::GetDC(NULL);
    pixel = ::GetPixel(hdcScreen, pos.x, pos.y);
    std::cout << pos.x << "," << pos.y << std::endl;
    ReleaseDC(NULL, hdcScreen);
 
    if (pixel != CLR_INVALID)
    {
        r = GetRValue(pixel);
        g = GetGValue(pixel);
        b = GetBValue(pixel);
        std::cout << r << "|" << g << "|" << b << std::endl;
    }
}
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,180
Записей в блоге: 1
Завершенные тесты: 2
29.09.2016, 21:27 #8

Не по теме:

Цитата Сообщение от dailydose Посмотреть сообщение
Пример испытвал на CS:GO, причём удачно.
Надеюсь, что вы на Non-steam тестили, а то Vac-ban к Вам уже бежит.


А вообще:
Цитата Сообщение от Правила форума
5.7. Запрещено создание и распространение вредоносного ПО, вирусов, кряков и взлома лицензионного софта, а также публикация ссылок для их скачивания.
Так что тему закроют, либо Ваше сообщение удалят.
1
dailydose
656 / 204 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
29.09.2016, 21:59  [ТС] #9
Цитата Сообщение от GbaLog- Посмотреть сообщение
Надеюсь, что вы на Non-steam тестили, а то Vac-ban к Вам уже бежит.
Вак не страшен - все равно игры редко играю

Цитата Сообщение от GbaLog- Посмотреть сообщение
Так что тему закроют, либо Ваше сообщение удалят.
я не думаю что это уж прям таки злостный чит -- это же всеголишь stupid aimbot
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
30.09.2016, 08:11 #10
Цитата Сообщение от dailydose Посмотреть сообщение
думаю пока еще рано за эту книгу браться
Не рано. Самое то.
1
dailydose
656 / 204 / 88
Регистрация: 21.07.2016
Сообщений: 1,024
Записей в блоге: 2
Завершенные тесты: 1
30.09.2016, 10:45  [ТС] #11
Пожалуй начну с Роберта Мартина «Чистый код». Дальше видно будет.

Вопрос закрыт, всем спасибо
0
30.09.2016, 10:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2016, 10:45
Привет! Вот еще темы с решениями:

Указатели и сссылки. Надо ли обнулять? когда и как это делать?
насчет ссылок вроде все ясно. обнулять их нет смысла на сколько я понимаю. А...

Почему Linux понимает русский язык, и как разучить его это делать?
Здравствуйте! Зная, что в Linux принята неравномерная кодировка UTF-8, я...

Правильно ли реализованы операторы (в смысле логики)?
mik-a-el, Отписался на форуме-теперь ответь пожалуйста)) bool operator...

Что это? Как правильно назвать?
const int T_height = 36; const int T_width = 2; const std::string Table =...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru