Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
1

Прошу оценить код на C++

25.02.2017, 18:58. Показов 1153. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сильно не пинайте, только начал изучать C++, написал вот такое кот. Что не так в этом коде? Перечислите, какие есть недостатки. Предложите свой вариант рефакторинга.

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
#include
 
class Feature {
public:
    enum FeatureType { eUnknown,
        eCircle,
        eTriangle,
        eSquare };
 
    Feature()
        : type(eUnknown)
        , points(0)
    {
    }
 
    ~Feature()
    {
        if (points)
            delete points;
    }
 
    bool isValid()
    {
        return type != eUnknown;
    }
 
    bool read(FILE* file)
    {
        if (fread(&type, sizeof(FeatureType), 1, file) != sizeof(FeatureType))
            return false;
        short n = 0;
        switch (type) {
        case eCircle:
            n = 3;
            break;
        case eTriangle:
            n = 6;
            break;
        case eSquare:
            n = 8;
            break;
        default:
            type = eUnknown;
            return false;
        }
        points = new double[n];
        if (!points)
            return false;
        return fread(&points, sizeof(double), n, file) == n * sizeof(double);
    }
    void draw()
    {
        switch (type) {
        case eCircle:
            drawCircle(points[0], points[1], points[2]);
            break;
        case eTriangle:
            drawPoligon(points, 6);
            break;
        case eSquare:
            drawPoligon(points, 8);
            break;
        }
    }
 
protected:
    void drawCircle(double centerX, double centerY, double radius);
    void drawPoligon(double* points, int size);
 
    double* points;
    FeatureType type;
};
 
int main(int argc, char* argv[])
{
    Feature feature;
    FILE* file = fopen("features.dat", "r");
    feature.read(file);
    if (!feature.isValid())
        return 1;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2017, 18:58
Ответы с готовыми решениями:

Прошу оценить свой уровень
Код во вложениях

Прошу оценить стиль программы
Всем мира! Ребят, в общем наваял я тут чудо-чудное, диво-дивное (мне так кажется:)) Прошу, чтоб...

Калькулятор для начинающих, прошу оценить
#include <iostream> #include <math.h> using namespace std; int menu (); int sum (); int razn...

Я не прошу писать мне код, я прошу подсказать мне, что за структура требуется в задании
Написать программу для работы по запросам оператора с приоритетной очередью запросов. Куча...

10
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
25.02.2017, 19:03 2
Цитата Сообщение от DevAlone Посмотреть сообщение
C++
1
2
if (points)
    delete points;
Можно убрать if.
Плюс ко всему, Вы выделяли память с помощью new[],
поэтому освобождать нужно с помощью delete[].
Цитата Сообщение от DevAlone Посмотреть сообщение
Предложите свой вариант рефакторинга.
Динамический полиморфизм?
1
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
25.02.2017, 19:55  [ТС] 3
Спасибо.
Вообще говоря, это задание из вакансии Яндекса https://yandex.ru/jobs/vacanci... yamaps_nn/ и мне было интересно, как его решат более опытные программисты, чем я, но похоже оценивать чужой код тут не любят
Вот моё решение:
1 Убрать пустой #include
2 использовать наследование и функцию draw сделать виртуальной
3 Использовать средства C++ для чтения файлов и вынести чтение за пределы класса Feature, ну или хотя бы назвать метод чуть более очевидно readFromFile
4 Использовать современные средства для управления памятью, вместо new delete.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
25.02.2017, 20:05 4
Цитата Сообщение от DevAlone Посмотреть сообщение
но похоже оценивать чужой код тут не любят
На всё нужно потратить время.
Если Вам заняться нечем,
то это не значит, что так у всех.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
25.02.2017, 20:17 5
Цитата Сообщение от DevAlone Посмотреть сообщение
1 Убрать пустой #include
Ага. А откуда возьмутся функции ака fread, fopen? Не из воздуха жеж.
Цитата Сообщение от Croessmah Посмотреть сообщение
Можно убрать if.
А разве удаление нулевого указателя корректно?

Добавлено через 10 минут
А всё, вспомнил. Там, вроде, внутри проверка есть.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
25.02.2017, 20:18 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
А разве удаление нулевого указателя корректно?
Корректно, никаких действий.
0
-16 / 14 / 3
Регистрация: 22.01.2013
Сообщений: 154
25.02.2017, 20:20 7
Ты - буратино.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
25.02.2017, 20:36  [ТС] 8
Цитата Сообщение от GbaLog- Посмотреть сообщение
Ага. А откуда возьмутся функции ака fread, fopen? Не из воздуха жеж.
Ну так тогда нужно приинклудить stdio.h
Цитата Сообщение от GbaLog- Посмотреть сообщение
А разве удаление нулевого указателя корректно
Да

Добавлено через 14 минут
Цитата Сообщение от DevAlone Посмотреть сообщение
Ну так тогда нужно приинклудить stdio.h
Он там есть, просто они забыли экранировать символы < > и браузер распознал его как тег...
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.02.2017, 01:59 9
Тут все просто. Алгоритм такой, очевидно:

1) Врубаемся в то, что делает код.
2) Включаем телепатию и просекаем, что должен делать код на самом деле.
3) Полностью стираем текущее поделие школьника-наркомана (в данном случае это явно так) и пишем свое.
4) Отправляем в яндекс. Ждем ответа.
5) Идем работать не в яндекс.
6) ...
7) Профит!
8
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
26.02.2017, 10:13 10
DevAlone, ну допустим я бы применил паттерн стратегия для реализации рисования объектов, что то типо такого
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <stdio.h>
#include <iostream>
 
class Drawer {
public:
    virtual ~Drawer() {}
    virtual void draw(double* data) = 0;
};
class CircleDrawer : public Drawer {
public:
    virtual void draw(double* data) override final { 
        //по разному тут обрабатываем массив с данными о круге
        std::cout << "Circle !" << std::endl; 
    };
};
class PolygonDrawer : public Drawer {
public:
    virtual void draw(double* data) override final {
        //по разному тут обрабатываем массив с данными о полигоне
        std::cout << "Polygon !" << std::endl;
    };
};
class TriangleDrawer : public Drawer {
public:
    virtual void draw(double* data) override final {
        //по разному тут обрабатываем массив с данными о треугольнике
        std::cout << "Triangle !" << std::endl;
    };
};
class DrawerRealisation {
protected:
    Drawer* drawer;
 
public:
    virtual ~DrawerRealisation() {}
    virtual void useDrawer(void) = 0;
    virtual void setDrawer(Drawer* drawer) = 0;
};
 
class Feature : public DrawerRealisation {
public:
    enum FeatureType {
        eUnknown,
        eCircle,
        eTriangle,
        eSquare
    };
 
    Feature() : type(eUnknown), points(nullptr) {}
 
    ~Feature() {
        if(points)
        delete[] points;
        delete drawer;
    }
 
    bool isValid() {
        return type != eUnknown;
    }
 
    bool read(FILE* file) {
        if (fread(&type, sizeof(FeatureType), 1, file) != sizeof(FeatureType))
            return false;
 
        short n = 0;
        switch (type) {
        case eCircle:
            n = 3;
            this->setDrawer(new CircleDrawer());
            break;
        case eTriangle:
            n = 6;
            this->setDrawer(new TriangleDrawer());
            break;
        case eSquare:
            n = 8;
            this->setDrawer(new PolygonDrawer());
            break;
        default:
            type = eUnknown;
            return false;
        }
 
        points = new double[n];
        if (!points)
            return false;
        return fread(&points, sizeof(double), n, file) == n * sizeof(double);
    }
 
 
    virtual void useDrawer(void) override final {
        drawer->draw(points);
    }
 
    virtual void setDrawer(Drawer* drawer) override final {
        this->drawer = drawer;
    }
 
protected:
    double* points;
    FeatureType type;
};
 
int main(int argc, char* argv[])
{
    Feature feature;
    FILE* file = fopen("features.dat", "r");
    feature.read(file);
 
    if (!feature.isValid())
        return 1;
 
    return 0;
}
Добавлено через 1 минуту
мне еще жутко не нравится метод read но как то его перерабатывать лень, но я чисто показать суть, что можно в этом коде что то и поменять, на правильность не претендую, но как по мне выглядит получше
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
26.02.2017, 10:19 11
Цитата Сообщение от obivan Посмотреть сообщение
мне еще жутко не нравится метод read
C++
1
fread(&points, sizeof(double), n, file)//Указатель в качестве буфера. ошибка перекочевала без изменений.
1
26.02.2017, 10:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2017, 10:19
Помогаю со студенческими работами здесь

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

Оценить код
Добрый день. В данный момент пишу Ray tracing. Если у вас есть время, оцените код. Какие советы вы...

Java для начинающих , прошу оценить код
я только учусь писать на java и очень прошу вас , пользователей данного портала имеющих опыт ,...

Прошу оценить код класса парсинга данных
Прошу заценить код, класс занимается парсингом данных. Прошу конструктивной критики. public...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru