669 / 215 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
1

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

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

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

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

Собственно вопрос -- как бороться с этим недугом? Где можно что почитать? До "Совершенный код" Макконнелла руки пока не доходят, постоянно откладываю на потом, да и думаю пока еще рано за эту книгу браться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2016, 16:33
Ответы с готовыми решениями:

Ссылки в подчиненной форме. Как правильно это делать?
Есть главная форма - Форм1 Есть подчиненная форма - Форм2 Причем Форм2 хотелось бы использовать в...

Определение сроков разработки проекта Как это делать правильно?
Помогите разобраться, как правильно определять сроки разработки проектов. Исходя из чего ставяться...

Подскажите, как упростить выражение и вообще, как это нужно делать правильно?
\left(\bar{x} + \bar{y} \right)\vee \left( \bar{y}\leftrightarrow \bar{x} \right)

"Проектирование базы данных" и "Разработка приложения" - в чем отличия?
Проектирование базы данных и разработка приложения - в чем отличия ? разные вещи? Можно простым...

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

Решение

Цитата Сообщение от dailydose Посмотреть сообщение
Собственно вопрос -- как бороться с этим недугом? Где можно что почитать? До "Совершенный код" Макконнелла руки пока не доходят, постоянно откладываю на потом, да и думаю пока еще рано за эту книгу браться.
Ну почему же, Макконнелл как раз своевременно и в тему. Конечно, он отпугивает своей толщиной, и воды в нем многовато, но его нужно читать выборочно.
"Чистый код" Роберта Мартина тоже очень хорошая книга.
Цитата Сообщение от dailydose Посмотреть сообщение
при получении задачи я сразу же берусь за написание кода, от этого и много проблем и ошибок разного рода, и как следствие приходится многое переписывать/передумывать.
Ну, вы наверно сразу с реализации начинаете, т.е. снизу вверх, а надо с проектирования начинать, т.е. сверху вниз.
Кстати, Роберт Мартин приводит очень простой и эффективный способ:
1) В функции main сначала пишете комментарий, в котором рассказываете что она должна делать.
2) Затем каждое действие заменяете вызовом функции, которую и называете по имени этого действия.
3) Далее реализуете эти функции таким же способом.
Т.е. сначала добиваетесь, чтобы функция main выглядела красиво, потом приступаете к реализации вызываемых в ней функций. Таким образом и код получается самодокументируемым, и проектирование само собой происходит.
1
Эксперт С++
8718 / 4299 / 957
Регистрация: 15.11.2014
Сообщений: 9,743
29.09.2016, 15:38 3
Цитата Сообщение от dailydose Посмотреть сообщение
как бороться с этим недугом?
Цитата Сообщение от dailydose Посмотреть сообщение
До "Совершенный код" Макконнелла руки пока не доходят
тогда - страдать.
1
669 / 215 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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
Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
29.09.2016, 17:45 5
Цитата Сообщение от dailydose Посмотреть сообщение
а вообще с какой книге посоветуете сейчас начать?
Ну, из этих книг мне "Чистый код" больше всего нравится. Умно и толково пишет о самых важных вещах и особо не растекается мыслью по древу.
1
Ушел с форума
Эксперт С++
16454 / 7418 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.09.2016, 18:42 6
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Цитата Сообщение от dailydose Посмотреть сообщение
Собственно вопрос -- как бороться с этим недугом?
Бери листик, ручку (условно) и описывай для себя, как будет работать
твоя программа, по какой схеме. Тут то, тут се, там это. Обычно сразу всплывают
какие-то загвоздки, которые тебе в ином случае пришлось бы решать уже "на ходу".
Когда наступит полная или почти полная ясность, можешь садиться и писать код.
1
669 / 215 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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
Любитель чаепитий
3734 / 1793 / 563
Регистрация: 24.08.2014
Сообщений: 5,998
Записей в блоге: 1
29.09.2016, 21:27 8

Не по теме:

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


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

Цитата Сообщение от GbaLog- Посмотреть сообщение
Так что тему закроют, либо Ваше сообщение удалят.
я не думаю что это уж прям таки злостный чит -- это же всеголишь stupid aimbot
0
Эксперт CЭксперт С++
5094 / 2279 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
30.09.2016, 08:11 10
Цитата Сообщение от dailydose Посмотреть сообщение
думаю пока еще рано за эту книгу браться
Не рано. Самое то.
1
669 / 215 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
30.09.2016, 10:45  [ТС] 11
Пожалуй начну с Роберта Мартина «Чистый код». Дальше видно будет.

Вопрос закрыт, всем спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2016, 10:45
Помогаю со студенческими работами здесь

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

Как это объясняется с точки зрения логики предметной области?
Имеется база данных с школьников, с предметами, оценками. Когда задается условие отбора 4 or 5 в...

Правильное проектирование классов или как гуру это делают?!
Здравствуйте форумчане, есть вопрос на который ввиду моей квалификации пока ответить не могу: :cry:...

Как это реализовать? И как это правильно называется?
Всем привет. Хочу достигнуть такого эффекта как на этом сайте http://www.kocha.com.au/ Суть...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru