LINUX.ORG.RU

Как избавиться от быдлокодинга и спагетти кода?

 


0

1

Вообщем напечатал проект, там в классе самом большом 1700 строк кода, решил переписать проект поначалу всё шло неплохо, но сейчас в нём 2900 строк в самом большом классе выполняющем тот же функционал с некоторыми улучшениями. Может я остановился в развитии в плане техники кодинга? С другой стороны спагетти код более понятен мне при условии что я иногда забрасываю проект на парочку месяцев. Что посоветуете?

Код измеряется не в строках, а в смысловых элементах. Если для реализации какой-то неделимой сущности нужна тысяча строк кода, значит функция должна занимать тысячу строк кода. Нет смысла проводить искусственное деление.

Usruser
()
Ответ на: комментарий от Usruser

Ну просто кода много и в нём теперь ошибки которые выявляются интеграционным тестированием, плюс этот проект висит в репозитории и как бы в моём резюме как портфолио и наверно портит репутацию

bad_master
() автор топика

Написать тесты. Сразу задумаешься как декомпозировать код так, чтобы покрыть тестами с наименьшими страданиями.

qaqa ★★
()

Вообщем есть несколько проблем:

  1. Надо как-то создать объект который надо отрисовать. Ну там координаты, текстура которая ему соответствует или несколько.
  2. Потом вытащить всё эти координаты из кода в файл.
  3. Напечатать алгоритм который будет об бегать эти координаты (причём на свежей версии графической библиотеки)
  4. Вместо картинок кнопок использовать настоящие кнопки из кутэ например. (Из-за чего у меня баги интеграционные) Ну это так навскидку. А вообще главный вопрос: В случае если я завершу проект и выложу его на своём сайте бесплатно будет какой нибудь профит?
bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 2)
Ответ на: комментарий от bad_master

Я тот ещё дриснякодер, но в чём тут проблема?

    • 1 Структурка с данными и всё.
    • 2 wb запись структуры в файл, все значения тупо в uint32_t укладывать и не важно что там у тебя флоаты, места хватить, писать читать удобно/быстро/надёжно.
    • 3 Алгоритм тупо читает за раз uint32_t кусочки из файла, кастуешь к тому что там на самом деле. Причём варсия графической библиотеки будет неважна, она и должна быть неважна у тебя данные свои в своём виде лежат.
    • 4 промолчу
LINUX-ORG-RU ★★★★★
()

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

naKovoNapalBaran
()
Последнее исправление: naKovoNapalBaran (всего исправлений: 2)

«А ответ ужасно прост и ответ единственный»

Надо проектировать ПО, а не сочинять код: Программы - не стихи, их надо проектировать, а не писать.

Простота требует проектирования и хорошего вкуса.

Л. Торвальдс

MittenShmitten
()
Последнее исправление: MittenShmitten (всего исправлений: 1)
Ответ на: комментарий от bad_master

Ты же не на электроне этот гуй пишешь?

Shadow ★★★★★
()

Смириться. Весь код дерьмо.

beastie ★★★★★
()

Что посоветуете?

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

e000xf000h
()
Последнее исправление: e000xf000h (всего исправлений: 1)

главное - зафиксировать скоуп проекта и кодить, исходя из этого скоупа. Все опасения «а что если выйдет за скоуп» решать фразой «ну, значит не повезло».

Например, если проект работает только при первой фазе луны - захардкодить ее и не передавать в функции дополнительным параметром.

Lrrr ★★★★★
()
Ответ на: комментарий от bad_master

Я, конечно, не настоящий сварщик, но думаю, что вот эти

image->TextureCoordinats[CountIndexTexture - 1][0] = 1.f; image->TextureCoordinats[CountIndexTexture - 1][1] = .0f; image->TextureCoordinats[CountIndexTexture - 1][2] = 1.f; image->TextureCoordinats

повторения можно как-то вынести в метод.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

смеха ради скажу что большая их часть даже нигде не используется

bad_master
() автор топика
Ответ на: комментарий от bad_master

У тебя большую часть кода занимают захардкоженные данные геометрии и текстур. Их можно описать как вершина, текстурная координата,цвет записать это просто в файл так как удобно тебе. Затем прочесть и сделать glGenBuffers задать ему прочтённый массив этих всех данных, а потом сделать glBindBuffer() выбрав что ты рисуешь и отрисовать glDrawElements() всё. Просто разделяй данные и код. Если ты не хочешь всех этих буферов и последующих шейдеров. То опять же раздели данные и код, вершины, uv координаты и цвета укажи отдельно просто в хоть текстовом файле строка на треугольник например. Затем читая свой сохранённый с данными файл передавай данные в цикле в glTexCoord2f(); glVertex3f();

Типа, хотя бы так (не прям так, а по такому принципу) :

enum renderable_offsets
{
  UV_1 = 0,
  UV_2 = 1,
  VE_1 = 2,
  VE_2 = 3,
  VE_3 = 4,
  RENDERABLE_OFFSET
};

void func(data)
{
glBindTexture(GL_TEXTURE_2D, data->texture);
glBegin(data->type);
for(int i; i < data->num_elems;i+=RENDERABLE_OFFSET)
{
 glTexCoord2f(data->renderable[i+UV_1],data->renderable[i+UV_2] );
 glVertex3f(data->renderable[i+VE_1], data->renderable[i+VE_2],data->renderable[i+VE_3]);
}
glEnd();
}

Загружай данные как данные просто в массив, заведи функцию которая эти данные обрабатывает. Когда у тебя всё вместе и код и данные то тебе самому тяжело. При любом изменении нужно компелять. Навигация очень затруднена.

Те данные которые всё же не хочется хранить во вне например из этого куска

if (i == 0)
	{
		glBegin(GL_POLYGON);//HELP

		glTexCoord2f(1.0f, 1.0f);
		glVertex3f(-.45f, -.9f, 1.0f);

		glTexCoord2f(1.0f, 0.0f);
		glVertex3f(-.45f, -1.f, 1.0f);

		glTexCoord2f(0.0f, 0.0f);
		glVertex3f(-.65f, -1.f, 1.0f);

		glTexCoord2f(0.0f, 1.0f);
		glVertex3f(-.65f, -.9f, 1.0f);

		glEnd();//HELP
	}

Опять же вынеси в отдельный массив

// 4   4     4      4       4
//[uv][uv][vertex][vertex][vertex] = offset 20
float help_data[] = 
{
1.0,1.0,-0.45,-0.9,1.0,//1
1.0,0.0,-0.45,-1.0,1.0,//2
0.0,0.0,-0.65,-1.0,1.0,//3
0.0,1.0,-065,-0.9,1.0, //4
}

//4 размер
//20 смещение
//функция по аналогии что выше
make_geometry(help_data,4,20);

Так ты получишь

  • Универсальную функцию построения геометрии
  • Универсальный (для тебя) формат записи данных модели

В разы уменьшишь объёмы кода без ущерба чему-то. Хотя уменьшение это будет побочный результат, суть тут в разделении кода и данных и унификации кода, он будет универсальным. Захотелось добавить цвет, ты не будешь в сотни строк его вписывать, а просто в функцию добавишь 1 строку, и в формате увеличишь смещение, а в данные уже просто впишешь цвет.

И вообще нафиг тебе это ООП которое ты всё равно мало используешь, пиши если уж так хочется на плюсах, но в процедурном стиле.

Для однотипных данных заведи структуры, а не поля классов, для обработки этих структур заведи функции простые, а не методы классов. Это и наглядно будет, у тебя все структуры данных будут в объявлениях видны и логика работы будет наглядной будет набор функций по обработке структур. Ну как вариант.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от bad_master

Хотел дописать не успел, но вот:

И вообще нафиг тебе это ООП которое ты всё равно мало используешь, пиши если уж так хочется на плюсах, но в процедурном стиле.

Для однотипных данных заведи структуры, а не поля классов, для обработки этих структур заведи функции простые, а не методы классов. Это и наглядно будет, у тебя все структуры данных будут в объявлениях видны и логика работы будет наглядной будет набор функций по обработке структур. Ну как вариант.

Ну и опять же по данным. Рано или поздно захочется большего.

  • Позиция вершины 3 флоата
  • Нормаль 3 флоата
  • Тангент 3 флоата
  • Бинормаль 3 флоата
  • UV координаты 2 флоата
  • Цвет 4 флоата

18 байт на «точку» можешь сразу выделять. И хранить вершину в таком формате например как просто массив. Таким образом ты опишешь любую геометрию, а отрисовывать уже как угодно хоть так как сейчас хоть вообще самому растеризовывать, хоть через буферы opengl или иного API .

LINUX-ORG-RU ★★★★★
()

First of all, try to change

image->TextureCoordinats[CountIndexTexture - 1][0] = 1.f;
image->TextureCoordinats[CountIndexTexture - 1][1] = .0f;
image->TextureCoordinats[CountIndexTexture - 1][2] = 1.f;
image->TextureCoordinats[CountIndexTexture - 1][3] = .0f;
to something like
image->TextureCoordinats[CountIndexTexture - 1] = {1.f, .0f, 1.f, 0.f};

It should drastically reduce the number of code lines.

Second, avoid using immediate OpenGL mode. Instead of drawing passing each vertex pos and textcoord, prepare arrays ahead and draw them using glDrawElements() or glDrawArrays.

You will see both reduction in code and your gpu will help you.

CyberK
()

Перепиши на Perl. Всё будет одной строкой.

perl5_guy ★★★★★
()
Ответ на: комментарий от Usruser

Если для реализации какой-то неделимой сущности нужна тысяча строк кода, значит функция должна занимать тысячу строк кода

А потом ты их будешь читать.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от Usruser

По моему надо баланс соблюдать. Либо комментировать каждые 20 строк либо еще разделять на функции с человекочитаемыми названиями

realbarmaley ★★
()
Ответ на: комментарий от Usruser

Если для реализации какой-то неделимой сущности нужна тысяча строк кода

Значит не проведена работа по декомпозиции.

javascript
()
Ответ на: комментарий от javascript

Декомпозиция не имеет цели сама по себе. Разделять ради разделения нерационально.

Usruser
()
Ответ на: комментарий от Usruser

А ты не передергивай. 10 строк на функцию - за глаза. Тем более в эпоху IDE ориентироваться в коде очень просто, даже в виме можно прыжки к определению функций настроить.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Количество строк (любое) не является полезным критерием хоть чего-то.

Можно написать 10 строк нечитаемого треша, а можно сотню строк программисткой поэзии.

Usruser
()
Ответ на: комментарий от LINUX-ORG-RU

99% держащих свои репы со своими проектами на гитхабе/лабе/сорсфорже и прочих

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

e000xf000h
()
Ответ на: комментарий от e000xf000h

да тут проблема когда вникаешь в чей-то стек, он никому не нужен кроме той организации где ты работаешь

bad_master
() автор топика
Ответ на: комментарий от bad_master

да тут проблема когда вникаешь в чей-то стек, он никому не нужен кроме той организации где ты работаешь

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

Отсюда и «уникальность». Я считаю компании сами сформировали подобный подход. Если бы можно было бы например запатентовать или лицензировать код или алгоритм то конечно это сильно бы облегчило структуру программных продуктов но боюсь бы очень сильно отбросило нас назад в плане разработок. Так что имеем то что имеем.

e000xf000h
()
Ответ на: комментарий от e000xf000h

в других проектах без моего участия

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

bad_master
() автор топика
Ответ на: комментарий от e000xf000h

Если бы можно было бы например запатентовать или лицензировать код или алгоритм

Иди в 3.14зду со своими запросами, тут про опенсорс.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Иди в 3.14зду со своими запросами,

ты от туда никогда и не вылезал

тут про опенсорс.

тут опенсос, там опенсос, кому какое дело где ты опенсосишь

e000xf000h
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.