Перейти к публикации
  • Сейчас на странице   Всего пользователей: 1   (0 пользователей, 1 гость)

Rooster

Программирование, т. 7

  

536 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

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

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

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

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

 

пара каментов формата "тут происходит Х" когда нет названий и всё должно быть понятно любому человеку который будет это читать

не стоит оценивать "читаемость функции для рандомного нового человека" по коду исключительно этой функции, особенно по с++ коду который работает с игровым движком

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

 

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

Поделиться сообщением


Ссылка на сообщение

 

 

1. если человек 30 лет пишет код то не факт что он хороший спец.

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

из того что я точно знаю о нем, он писал всю низкоуровневую архитектуру хало 5

Поделиться сообщением


Ссылка на сообщение

 

1. если человек 30 лет пишет код то не факт что он хороший спец.

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

из того что я точно знаю о нем, он писал всю низкоуровневую архитектуру хало 5

 

тут одна бабка сказала, что в halo5 использовался движок предыдущей версии


Публикация отключена

Поделиться сообщением


Ссылка на сообщение

яхз что именно, он с ними десяток лет работал

так что мб и пред движок считается  :dunno:

Поделиться сообщением


Ссылка на сообщение
на самом деле это _вам_ кажется что код нечитаемый и хуёвый потому что вы не имеете понятия как оно работает и что там происходит изначально

 

пара каментов формата "тут происходит Х" когда нет названий и всё должно быть понятно любому человеку который будет это читать

не стоит оценивать "читаемость функции для рандомного нового человека" по коду исключительно этой функции, особенно по с++ коду который работает с игровым движком

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

 

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

 

может я действительно долбоеб, но я не понимаю в чем охуенность и читаемость функции, длина которой - 150+ строк с 7м уровнем вложенности. нихуя не понимаю, почему бы вместо "пары комментариев" сделать пару методов в имени которых написано, что происходит внутри этого метода и просто его вызвать там, где нужно (пусть даже блядь это будет однажды, что в этом такого), зато как минимум ты не будешь листать это ебаное полотно на 4 экрана вспоминая, что там за комментарии были выше, ты просто прочтешь названия трех вызываемых методов и поймешь из каких шагов состоит эта операция.

 

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

Поделиться сообщением


Ссылка на сообщение

причем тут геймдев, таких длинных алгоритмов у которых реально 50 строк хотя бы на 50% связанных друг с другом я не видел никогда

всегда алгоритмы делятся на достаточно независимые шаги, которые и надо выделять в методы,

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

а и что из этого полотна можно вообще потрогать без опаски сломать всё остальное

Supremus и fessnik понравилось это

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

Поделиться сообщением


Ссылка на сообщение
(изменено)

может я действительно долбоеб, но я не понимаю в чем охуенность и читаемость функции, длина которой - 150+ строк с 7м уровнем вложенности

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

 

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

зачем?

щас бы смотреть код одного функционала по трём разным методам

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

 

ещё чего я не понимаю это отсутствие пустых строк чтоб отделять блоки функции

по-моему если добавить хотя бы это то разделять чето по методам нахуй не надо

 

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

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


Изменено пользователем TheDeadSkin

Поделиться сообщением


Ссылка на сообщение
(изменено)
щас бы смотреть код одного функционала по трём разным методам

 

Это часть платформы, поиск границ, код сначала рейтрейсит в сторону чтоб узнать нет ли там стены, потом вниз, чтоб узнать есть ли там пол, если его нет, он проверяет был ли пол предыдущий раз и если он был, использует ту инфу чтоб поставить границу.

:hmm:


Изменено пользователем Supremus

Поделиться сообщением


Ссылка на сообщение
(изменено)

"сначала ... потом" не значит что это изолированый функционал который надо распиливать на кучу методов

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

миллиард советов что надо куда вынести хотя это даже не ваш код

 

объективно проблемный там только повторяющийся функционал (лево/право или как минимум резеты в элсах) и отсутствие маркера конца лямбды


Изменено пользователем TheDeadSkin

Поделиться сообщением


Ссылка на сообщение

как скажешь  :pisubudew: 
не имею ни малейшего желания разводить сейчас холивар, кому нужно, тот и так все поймет, взглянув на этот метод-небоскрёб

Поделиться сообщением


Ссылка на сообщение

зато над фабриками фабрик из джавы первые смеяться будут

подавай им одновременно и не-километровые названия и методы по 20 строк макс и ещё размер класса наверное не должен быть больше 100, чтоб потом надо было 7 уровней вложености папок с сорсниками вместо 7 вложеностей ифов в методе

Поделиться сообщением


Ссылка на сообщение

 


Ты не слишком определенно тыкаешь в ifelse которые не верные и говоришь что так не надо в общем делать

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



Я тебе показал один конкретный пример, который делает код более читаемый и уменьшает код в три раза, что тут для тебя "неопределенное это" ??
Я тебе написал что у тебя есть магическое число 1, которое хуй пойми что такое. Я тебе написал что у тебя куча if else, внутри которых еще if else, который делают код более сложным для понимания и доработки, когда у тебя вдруг появится еще одно условие, ты вхуяришь еще один if else и это превратится в код "работает не трогай". Сорри, но ты не тот человек на форуме, которому я бы вдруг решил провести полное код ревью всего кода

 

 

там год еще в блупринтах, совсем другая история. 
 

Что такое "блупринтах" я хз, но если я педалю год на джаве, год на плюсах и год на питоне, то у меня будет 3 года программирования, а не год

 

 

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


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

 


 

а ты кем работаешь и как давно?



3 года пхпшку педалю 

Поделиться сообщением


Ссылка на сообщение

 

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

 

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

 

если сделать минимальную оптимизацию структуры т.е. убрать самый первый уровень вложености (который покрывает собой 99% функции) и заменить if return else return на один ретурн то там даже 3 уровней ифов нигде не будет

больше там ничего толком не надо менять

 

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

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

Поделиться сообщением


Ссылка на сообщение

 

 

если сделать минимальную оптимизацию структуры т.е. убрать самый первый уровень вложености (который покрывает собой 99% функции) и заменить if return else return на один ретурн то там даже 3 уровней ифов нигде не будет
больше там ничего толком не надо менять
 

ну офк , если из 4 уровней убрать 2, то будет лучше, но в его одном из лучших кусков кода, этого не сделано

Поделиться сообщением


Ссылка на сообщение

 

 

Сорри, но ты не тот человек на форуме, которому я бы вдруг решил провести полное код ревью всего кода

ну и ехай нахуй, ты не нужен значит мне. 

Поделиться сообщением


Ссылка на сообщение

 

 

ну и ехай нахуй, ты не нужен значит мне. 


Что ты еще мог написать, так обосравшись)

Поделиться сообщением


Ссылка на сообщение

как скажешь  :pisubudew: 

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

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

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

 

Из всего что я вывел, все что вы сказали тут, я действительно сделал один рефактор который имел смысл, это запаковку ресет и ретурн в одну лямду ибо это важно, ресет в этой функции всегда одинаков, все остальное это вкусовщина с глобальным ifelse который абсолютно никак не влияет на читаемость кода ибо все что в else это return false; и бранчи на success & fail которые обязательно нужны но так как вы нихера не понимаете что именно происходит, какие елементы важны и не могут быть убраны вы тыкаете в то и мол вот это бы убрать ибо не читаемо а еще вот тут екстра проверка которую нужно убрать, хуйня ваше мнение именно по этому поводу.

 

			if (bDrawBoundarySearchTrace)
			{
				const FName traceTag("InitTraceTag");
				GetWorld()->DebugDrawTraceTag = traceTag;
				groundTraceParams.TraceTag = traceTag;
				if (bDrawBoundarySearchWallTrace)
				{
					wallTraceParams.TraceTag = traceTag;
				}
			}

вот подобных 3 штуки, их не надо комментить, их не надо объяснять, их не надо паковать отдельно, это параметр который можно настроить внутри эдитора в рамочке и когда дойдет сюда если bDrawBoundarySearchTrace - булеанРисоватьГраницаПоискСледы не требует никаких объяснений и прятаний, это часть рутины.

 

ну и ехай нахуй, ты не нужен значит мне. 

Что ты еще мог написать, так обосравшись)

это твое мнение, оно не правильное, но это нормально, ты человек и можешь ошибатся.

кстати не вижу никаких магических чисел там.

Поделиться сообщением


Ссылка на сообщение
(изменено)
но так как вы нихера не понимаете что именно происходит

 

 

Сорри, ты слишком ахуеннен, твой код уникальный и кроме тебя так никто не умеет(

 

кстати не вижу никаких магических чисел там.

 

 

Вот бы в своем коде ничего не видеть

 

if (GetWorld() && ActiveOverlapTriggers.Num() == 1)

 


Изменено пользователем fessnik

Поделиться сообщением


Ссылка на сообщение

Это особенность системы которая вне скопа данного разговора, поинт защитан, с твоей стороны может выглядеть странно.
В апдейте тут его уже нет ибо изменилось то как работает платформа, раз я уж полез туда сегодня я переделал и ее.
 

 

 

wWVLe.png

 

код

 

bool AWalkingPlatform::UpdateBoundaries()
{
	if (GetWorld())
	{
		bool bSuccessfulTraceRoutine = false;
		FVector traceHitResult(ForceInit);
		// Lambda for trace routine.
		auto TraceRoutine = [&](FVector& OutTraceRoutineHitResult, const FVector& InSideTraceStepOffset) -> bool
		{
			bool bTraceHit = false;
			bool bHitOnceBefore = false;
			OutTraceRoutineHitResult = FVector::ZeroVector;
			FHitResult boundariesTraceHitResult(ForceInit);
			FHitResult wallTraceHitResult(ForceInit);
			FVector traceStart;
			FVector traceEnd;
			const FCollisionShape traceShape = TraceShapeEnumFunctions::MakeShapeForTrace(TraceShapeType, TraceShapeSize);
			FCollisionQueryParams groundTraceParams;
			groundTraceParams.bTraceAsyncScene = true;
			FCollisionQueryParams wallTraceParams = groundTraceParams;
			if (bDrawBoundarySearchTrace)
			{
				const FName traceTag("InitTraceTag");
				GetWorld()->DebugDrawTraceTag = traceTag;
				groundTraceParams.TraceTag = traceTag;
				if (bDrawBoundarySearchWallTrace)
				{
					wallTraceParams.TraceTag = traceTag;
				}
			}
			else
			{
				if (bDrawBoundarySearchWallTrace)
				{
					const FName traceTag("InitTraceTag");
					GetWorld()->DebugDrawTraceTag = traceTag;
					wallTraceParams.TraceTag = traceTag;
				}
			}
			for (int32 i = 0; i < BoundaryTraceSideStepLimit; ++i)
			{
				boundariesTraceHitResult.Init();
				traceStart = GetActorLocation() + InSideTraceStepOffset * i;
				traceStart.Z = traceStart.Z + BoundaryTraceStartZOffset;
				traceEnd.Set(traceStart.X, traceStart.Y, traceStart.Z - BoundaryTraceLengthZ);
				// Trace sideways to find is there is a wall on the way.
				if (bCheckWallsOnBoundariesUpdate)
				{
					FVector wallTraceEnd = TraceShapeEnumFunctions::GetExtent(traceShape, TraceShapeType);
					wallTraceEnd.X = wallTraceEnd.X + traceStart.X + 2.f * InSideTraceStepOffset.X;
					wallTraceEnd.Y = wallTraceEnd.Y + traceStart.Y + 2.f * InSideTraceStepOffset.Y;
					wallTraceEnd.Z = traceStart.Z;
					bTraceHit = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult
						, FVector(GetActorLocation().X, GetActorLocation().Y, traceStart.Z)
						, wallTraceEnd
						, FQuat(), ECollisionChannel::ECC_Visibility, traceShape, wallTraceParams);
					if (bTraceHit)
					{
						break;
					}
				}
				// Trace for floor
				if (TraceShapeType == ETraceShape::ETS_Line)
				{
					bTraceHit = GetWorld()->LineTraceSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, ECollisionChannel::ECC_Visibility, groundTraceParams);
					if (bTraceHit)
					{
						OutTraceRoutineHitResult = boundariesTraceHitResult.Location;
						bHitOnceBefore = true;
					}
					else
					{
						break;
					}
				}
				else
				{
					bTraceHit = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, FQuat(), ECollisionChannel::ECC_Visibility, traceShape, groundTraceParams);
					if (bTraceHit)
					{
						OutTraceRoutineHitResult = boundariesTraceHitResult.ImpactPoint;
						bHitOnceBefore = true;
					}
					else
					{
						break;
					}
				}
			} //for (int32 i = 0; i < BoundaryTraceSideStepLimit; ++i)
			if (bDrawBoundarySearchTrace || bDrawBoundarySearchWallTrace)
			{
				GetWorld()->DebugDrawTraceTag = NAME_None;
			}
			return bHitOnceBefore;
		};
		auto resetBoundaries = [&]()
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
		};
		auto covertAndSaveResult = [&](const FVector& TraceResult, const bool bIsLeft)
		{
			if (bIsLeft)
			{
				LeftBoundary.SetNodeLocation(traceHitResult + TraceResutlToBoundaryOffsetLeft);
				LeftBoundaryLocation = LeftBoundary.GetNodeLocation();
				if (LeftBoundaryGuideSphere)
				{
					LeftBoundaryGuideSphere->SetWorldLocation(LeftBoundaryLocation);
				}
			}
			else
			{
				RightBoundary.SetNodeLocation(traceHitResult + TraceResutlToBoundaryOffsetRight);
				RightBoundaryLocation = RightBoundary.GetNodeLocation();
				if (RightBoundaryGuideSphere)
				{
					RightBoundaryGuideSphere->SetWorldLocation(RightBoundaryLocation);
				}
			}

		};
		// Trace Left
		bSuccessfulTraceRoutine = TraceRoutine(traceHitResult, LeftDirection * BoundaryTraceStepLength);
		if (bSuccessfulTraceRoutine)
		{
			covertAndSaveResult(traceHitResult, true);
		} //bSuccessfulTraceRoutine
		else
		{
			resetBoundaries();
			return false;
		} // else bSuccessfulTraceRoutine
		// Trace Right
		bSuccessfulTraceRoutine = TraceRoutine(traceHitResult, RightDirection * BoundaryTraceStepLength);
		if (bSuccessfulTraceRoutine)
		{
			covertAndSaveResult(traceHitResult, false);
			if (bDrawBoundaryLocation)
			{
				DrawDebugSphere(GetWorld(), LeftBoundary.GetNodeLocation(), 20.f, 12, FColor(255, 0, 0), false, BoundaryLocationDrawLifetime);
				DrawDebugSphere(GetWorld(), RightBoundary.GetNodeLocation(), 20.f, 12, FColor(0, 0, 255), false, BoundaryLocationDrawLifetime);
			}
			return true;
		} //bSuccessfulTraceRoutine
		else
		{
			resetBoundaries();
			return false;
		} // else bSuccessfulTraceRoutine
	} //if (GetWorld()) 
	else
	{
		return false;
	}
} 

 

 

 

 

 

 

 

Сорри, ты слишком ахуеннен, твой код уникальный и кроме тебя так никто не умеет(

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

Поделиться сообщением


Ссылка на сообщение
(изменено)
Это особенность системы которая вне скопа данного разговор

 

 

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

 

 

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

 

 

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

 


Изменено пользователем fessnik

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...