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

Rooster

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

  

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

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

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

 

 

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


Отличный ответ на мои два вопроса 
Может вообще за тебя начать кодить, зачем останавливатся на "предлагай", давай вообще тебе это кусок перепишу? 
Ну за год ( хотя уверен на 90% что ты как-то писал 2года) , ты уже стал экспертом и легко определяешь какой яп говно, а какой нет

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


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

я заменил на 

{
break;
}
я сделал один единственный выход из лямбды, нашел баг - если лямбда делала так чтоб трейсы рисовали дебаг, и так как делает это она в глобальном объекте как параметр, его нужно было обнулить потом.

 

 

Где и кем это считается нормальным? В пхп за такое растреливают, а в "норм" языках это ок?

вот это 2 вопроса на которые я, как ты сказал, не ответил?

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

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

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


 

 

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

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

ты такой не нужен и твои комменты в вакууме не помогает никому.


 

 

Ну за год ( хотя уверен на 90% что ты как-то писал 2года)

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

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


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

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

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


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

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


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

 

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

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

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

 

fessnik

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

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

вот тут дико плюсану.

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

 

по коду игродела - не увидел ничего криминального

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


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

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


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

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

 

Вот с этим просто я не согласен вот так в лоб:
 

это пиздец огромный и совершенно нечитаемый кусок кода

 

а вот это я не понял:
 

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


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

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


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

а вот это я не понял:

 

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

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

 

 

Вот с этим просто я не согласен вот так в лоб:

 

это пиздец огромный и совершенно нечитаемый кусок кода

 

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

 

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

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

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


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

ОДИН МЕТОД ДЛИННОЮ В ~150 СТРОЧЕК КОДА, С КУЧЕЙ IF ELSE И УРОВНЕМ ВЛОЖЕННОСТИ ДО 7 ДОПОЛНИТЕЛЬНЫХ ТАБУЛЯЦИЙ, КАРЛ!

НОРМ КОД

ВООБЩЕ ПИЗДЕЦ ПРОСТО НОРМ КОД НАХУЙ

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

 

там половина табуляций это не if'ы, а другую половину можно отрефакторить в виде return a && b; или ClassName var = x.condition() ? a : b;

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

если отрефакторить его то это будет хороший код

 

а вот твои css магические свистелки перделки вот это всегда нечитаемо, просто нихуя не понятно абсолютно наверное никому кроме самого автора

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


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

 

 

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

зачем создавать функцию, отдельную, для 14 строк кода которые используются один раз, в одном единственном месте?
 

вся функция это

{
обявление лямбды doTrace(params); со всей логикой поиска
 

bSuccessful  = doTrace(параметры для левой стороны);
if(bSuccessful)
{
 конвертировать результат левой стороны и сохранить как нужно для левых параметров;
}
else
{
обнулить все и выйти.
}

bSuccessful  = doTrace(параметры для правой стороны);
if(bSuccessful)
{
 конвертировать результат правой стороны и сохранить как нужно для правых параметров;
}
else
{
обнулить все и выйти.
}

 

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

 

http://puu.sh/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;
	}
} 

 

 

 



 

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


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

ку

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

(я неопытный)


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

сосать хуй для пидоров
футболл для пидаров
планшеты для пидоров

8mFJc.png

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


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

нахуя?

зачем вообще ассемблер в 21 веке?

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

 

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

хотя нахуя тебе это - непонятно


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

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


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

спасибо


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

сосать хуй для пидоров
футболл для пидаров
планшеты для пидоров

8mFJc.png

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


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

он мертвый или что ?

LDIR и вся недолга

#8000 LD HL,#8000
LD DE,#8001
LD BC,#FFFF
LD (HL),L
LDIR
RET

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

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


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

) ок


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

сосать хуй для пидоров
футболл для пидаров
планшеты для пидоров

8mFJc.png

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


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

MEMTST EQU #4000
LD HL,CNTLDR
LD DE,MEMTST
LD BC,3+ELDR-CNTLDR
PUSH DE
LDIR
RET
CNTLDR LD HL,MEMTST
LD DE,MEMTST+1
LD BC,ELDR-CNTLDR-1
LD (HL),0
LDIR
JP NO_LDR
ELDR JP EMUL
NO_LDR

LD HL,addr
LD DE,addr+1
LD BC,len-1
LD (HL),0
LDIR

main3

    ld a,(lastkeypressed)

    res 4,a

    ld (lastkeypressed),a

    call smalldelay

    pop af

    ld b,a

    ld a,(keypressmask)

    and b

    jr l6

 

а ведь это всего лишь Z80

ты правда хочешь в этом всем разбираться?


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

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


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

на самом деле вопрос в денежке

табличку я почекал

но пока не определился
вот и интересуюсь


сосать хуй для пидоров
футболл для пидаров
планшеты для пидоров

8mFJc.png

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


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

зачем создавать функцию, отдельную, для 14 строк кода которые используются один раз, в одном единственном месте?

 ...

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

 

 

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;
	}
} 

 

 

 

 

Проблема длинных методов в том что их тяжело читать и тяжело тестировать.
Я не сильно понимаю, почему бы тебе не сделать лямбды отдельными методами (хотябы первую).
Нет ничего особо плохого в том что метод используется всего в 1 месте, как плюс ты можешь написать тесты для этого метода, что упростит поддержку в будущем.
Просто, по большому счету, всю программу можно написать внутри мейна, потому что логика используется один раз в единственном месте :)
 
Еще у тебя есть повторение структуры
    if (bSuccessfulTraceRoutine)     {   ...   } 
    else
    {
        resetBoundaries();
        return false;
    }
что не очень хорошо, это тоже можно отрефакторить.
 
Еще я бы например сделал в начале метода что-то типа
    if (!GetWorld()) return false;
Не нужна была бы лишняя вложенность на весь метод (ну это на самом деле больше вкусовщина, оба варианта имеют право быть).
 
Суть в том, что если вынести все в отдельные методы, то метод с твоей логикой привратиться в что-то типа:

bool AWalkingPlatform::UpdateBoundaries()
{
    if (!GetWorld()) 
    {
        return false;
    }
 
    FVector traceHitResult(ForceInit);
 
    const bool handledLeftSomething = handleLeftSomething(traceHitResult);
 
    // можно вообще избавиться от переменной и вставить сюда непосредственно вызов функции (опять же кому как нравится).
    if (!handledLeftSomething)
    {
        return false;
    }
 
    const bool handledRightSomething = handleRightSomething(traceHitResult);
 
    // same
    if (!handledRightSomething)
    {
        return false;
    }
 
    return true;
}

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

 

ку

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

(я неопытный)

 

Если учишся в универе и есть такой предмет, то лишним не будет.

Если учишся сам с нуля, то оно того не стоит, по крайней мере по началу.

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

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


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

офк лишь бы пиздануть

 

Вот это говно

 

 

if (bHitTrace)
{
if (bHitOnce)
{
return true;
}
else
{
return false;
}
}

 

 

 

можно сократить так

 

 

if (bHitTrace && bHitOnce)
{
return true;
}
return false;

 

 

 

 

Это ж элементарно

Имена переменных по 30 символов тоже крутяк, магические числа, куча вложенных if-else

Или это рили считается у вас нормальным кодом? :xd:

 

тут плюсую жилкину, я бы сделал return (bHitTrace && bHitOnce);

 

ОДИН МЕТОД ДЛИННОЮ В ~150 СТРОЧЕК КОДА, С КУЧЕЙ IF ELSE И УРОВНЕМ ВЛОЖЕННОСТИ ДО 7 ДОПОЛНИТЕЛЬНЫХ ТАБУЛЯЦИЙ, КАРЛ!

НОРМ КОД

ВООБЩЕ ПИЗДЕЦ ПРОСТО НОРМ КОД НАХУЙ

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

 

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

 

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

func() { подзадача1(); подзадача2(); подзадача3(); } то нахуй оно надо

 

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

 

вообще у меня замечаний к его коду минимум

- конец лямбды стоит промаркировать каментом // end lambda ибо она большая

- вместо if (условие) { 140 строк кода; } else { return false; } стоит сделать if (!условие) { return false; } 140 строк кода; чтоб убрать один уровень вложености. и остальные подобные вещи типа той что в квоте выше

- если trace left и trace right можно без особоых проблем вынести в одну одтельную функции где left/right это аргумент то так и сделать

 

собственно всё


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

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


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

на самом деле вопрос в денежке

табличку я почекал

но пока не определился

вот и интересуюсь

в смысле ты рассматриваешь ассемблер как проф деятельность с которой начать? XD

 

жесть

 

хуярь на js, щас это в тренде

 

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

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

 

только явно парень собирающийся в МГУ на топовые специальности не стал бы спрашивать "где почитать про ассемблер"


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

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


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

 

 

- вместо if (условие) { 140 строк кода; } else { return false; } стоит сделать if (!условие) { return false; } 140 строк кода; чтоб убрать один уровень вложености. и остальные подобные вещи типа той что в квоте выше
 

я когда то спрашивал сеньйора одного, тот только на плюсах и лет 30 уже код пишет, как делать, он сказал что он делает именно так как я, объективной причины у него небыло, так как у меня нет варианта другого, я делаю так как делал он.
Так же, вот именно этот подход, спасает в ситуациях когда у меня проверок 6 вот таких и каждая из них если фейлится должна писать в лог отчет.
С твоим подходом будет

 

if(!check)
{
LOG
return;
}

if(!check2)
{
LOG
​return;
}

if(!check3)
{
LOG
​return;
}

 

 

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


 

 

- если trace left и trace right можно без особоых проблем вынести в одну одтельную функции где left/right это аргумент то так и сделать

А зачем, почему не лямбда с параметром, вот ЗАЧЕМ ЭТИ ФУНКЦИИ?
разницы между лямбдой никакой, так же сворачивается красивенько + доступ к локальным если нужно, а хедер не засоряет херней для одной единственной части функции. Вот у меня сильно чувство что оттуда где эти веберы пришли, у вас сильно много алгоритмов есть в несколько строк и все, вот вы и считаете эти строки.
У меня вон в лямбде рейкаста 2, для того чтоб ихвызвать мне нужно 10 строк только объявления параметров и сетапа их, вот так оно работает.

 

 

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;
					}
				} 

 

 

 

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

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


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

 

- вместо if (условие) { 140 строк кода; } else { return false; } стоит сделать if (!условие) { return false; } 140 строк кода; чтоб убрать один уровень вложености. и остальные подобные вещи типа той что в квоте выше
 

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

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

2. ты никогда без опыта не поймешь почему пишут люди так а не иначе

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

так что то что работало для него и тогда совсем не факт что дальше работает.

 

в общем - больше практики и понимания.

хороший программист - не тот кто пишет хороший код, а тот кто эффективно решает проблемы/задачи бизнеса посредством работы в команде над кодом.


Изменено пользователем Just.Doit

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

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


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

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