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

Rooster

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

  

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

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

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

Не, ты просто не шаришь и доебываешься, забей.

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


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

нахуя 150 строк кода разбивать на разные функции чисто чтоб разбить? я никогда не понимал этого подхода "функции должны быть не больше Х строк, классы не больше У строк" и подобного. они должны быть ровно того размера который требует ситуация.

 

 

 

 

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

Вот устроишься ты на какую-нибудь работу, скажут тебе пофиксить какую-то ебань, залезаешь ты в такой вот чудный файл с 1к строчек кода и потом с кайфом ебешься с методом длинною в 150-200 строчек, ММММ КАЙФ.

Я тут сейчас с ума сходил, из-за того что у меня весьма сложный компонент разросся до 270 строчек кода и там была пачка методов, некоторые из которых достигали аж 25-30 строчек логики, а тут блядь "200 это нормас, главное что делает одну фичу и все ок!"


userbar-53933.png

http://codepen.io/suez/ - they see me bydlocoding, they hatin.

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


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

вы просто не шарите!!111 

код конвешн и соглашения тут не работают, потому что это си и ваще геймдев!!111

щас бы ретурн булево делать в 4 строчки  :pray:

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


:buba:

ни мало ни много, а много и мало

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


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

Это и есть код конвеншин, каждый if должен иметь else и они оба должны быть в скобках.


 

 

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

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


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

 

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

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

 

 

 

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 года пхп которые никак не транслируются на плюсы, что удивительно но все же.

 

Вообще-то твой код без изменений (либо с незначительными изменениями) заработает на любом языке - конструкция if-else везде одинаковая.

 

Это и есть код конвеншин, каждый if должен иметь else и они оба должны быть в скобках.

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


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

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

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


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

 

 

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

получается ваше слово против их (или же моей интерпритации их слов)
https://docs.unrealengine.com/latest/INT/Programming/Development/CodingStandard/#if-else

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


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

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

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


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

В моем случае с if (GetWorld()) там должен быть лог, но его было влом писать, остальные функции выглядят вот так
 

	if (!PathTypes.Contains(ENodePathType::ENPT_NoPath))
	{
		if (TargetPlatform)
		{
			if (SourcePlatform)
			{
                         ...
			}
			else
			{
				UE_LOG(LogTemp, Warning, TEXT("%s[%d]: SourcePlatform is not valid. TargetPlatform: %s.")
					, *FString(__FUNCTION__), __LINE__, *TargetPlatform->GetName());
				return false;
			}
		}
		else
		{
			UE_LOG(LogTemp, Warning, TEXT("%s[%d]: TargetPlatform is not valid.")
				, *FString(__FUNCTION__), __LINE__);
			return false;
		}
	}
	else
	{
		UE_LOG(LogTemp, Warning, TEXT("%s[%d]: PathType cannot be ENodePathType::ENPT_NoPath.")
			, *FString(__FUNCTION__), __LINE__);
		return false;
	}

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

if (PathTypes.Contains(ENodePathType::ENPT_NoPath))
{
	UE_LOG(LogTemp, Warning, TEXT("%s[%d]: PathType cannot be ENodePathType::ENPT_NoPath.")
		, *FString(__FUNCTION__), __LINE__);
	return false;
}
if (!TargetPlatform)
{
	UE_LOG(LogTemp, Warning, TEXT("%s[%d]: TargetPlatform is not valid.")
		, *FString(__FUNCTION__), __LINE__);
	return false;
}
if (!SourcePlatform)
{
	UE_LOG(LogTemp, Warning, TEXT("%s[%d]: SourcePlatform or Source is not valid. TargetPlatform: %s.")
		, *FString(__FUNCTION__), __LINE__, *TargetPlatform->GetName());
	return false;
}

и единственный человек которого я спрашивал, говорил что он лично делает первы вариант.
Тут тупо трейд того что первые 25-40 линий функции не имеют ее логики, только проверки или же функция растет в сторону изза вложеных if но весь лог снизу, как делал я.

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


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

А че, в крестах нету какого-нить кейс-свитч?

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


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

 

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

получается ваше слово против их (или же моей интерпритации их слов)

https://docs.unrealengine.com/latest/INT/Programming/Development/CodingStandard/#if-else

 

ты неправильно их понимаешь, там написано только то, что нужно ВСЕГДА использовать скобочки и ничего более:

 

If - Else

Each block of execution in an if-else statement should be in braces. This is to prevent editing mistakes - when braces are not used, someone could unwittingly add another line to an if block. The line would not be controlled by the if expression, which would be bad. Worse yet is when conditionally compiled items cause if/else statements to break. So always use braces.

А че, в крестах нету какого-нить кейс-свитч?

есть, но только для целочисленных значений


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

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


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

А че, в крестах нету какого-нить кейс-свитч?

тип 

switch (int32)

{

case 0:

{}

case 1:

{}

default:

{}

}

не вижу как именно это полезно.

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

 

 

ты неправильно их понимаешь, там написано только то, что нужно ВСЕГДА использовать скобочки и ничего более:

да я тупо неверно прочел твой вопрос и неверно на него ответил, основная критика того что я делаю это именно этот if на все тело функции.

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


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

 

нахуя 150 строк кода разбивать на разные функции чисто чтоб разбить? я никогда не понимал этого подхода "функции должны быть не больше Х строк, классы не больше У строк" и подобного. они должны быть ровно того размера который требует ситуация.

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

Вот устроишься ты на какую-нибудь работу, скажут тебе пофиксить какую-то ебань, залезаешь ты в такой вот чудный файл с 1к строчек кода и потом с кайфом ебешься с методом длинною в 150-200 строчек, ММММ КАЙФ.

Я тут сейчас с ума сходил, из-за того что у меня весьма сложный компонент разросся до 270 строчек кода и там была пачка методов, некоторые из которых достигали аж 25-30 строчек логики, а тут блядь "200 это нормас, главное что делает одну фичу и все ок!"

 

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

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

 

и единственный человек которого я спрашивал, говорил что он лично делает первы вариант.

Тут тупо трейд того что первые 25-40 линий функции не имеют ее логики, только проверки или же функция растет в сторону изза вложеных if но весь лог снизу, как делал я.

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

большинство стандартов ограничивают длинну строки 80, 90 или 120 символов, у тебя в том куске самая длинная это 178. я например нормально не могу это читать в ИДЕ открытой на 50-60% экрана как я обычно это делаю и это при том что там помещается 150 обычно, даже не 80-120

 

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


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

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


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

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

not-amused-pepe.png

 

 

http://i.imgur.com/mjoon8g.png

 

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


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

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

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


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

А он еще и legacy почти везде)00

 

а еще самые рофлы, это что

InitRecord;

InitNoseries; 

 

и т.д. это все функции еще с большим полотном IF ELSE)


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

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


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

 

 

большинство стандартов ограничивают длинну строки 80, 90 или 120 символов, у тебя в том куске самая длинная это 178. я например нормально не могу это читать в ИДЕ открытой на 50-60% экрана как я обычно это делаю и это при том что там помещается 150 обычно, даже не 80-120

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

http://puu.sh/wXFSJ.png 

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


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

почему горизонтальный скроллбар тогда есть?

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


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

вот это не влазит, чо эксперты посоветуют?

http://puu.sh/wXGho.gif

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


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

вот это не влазит, чо эксперты посоветуют?

 

wXGho.gif

 

 

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


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

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


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

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