Как это правильно закодить?

6yrop

че та у меня настроение сегодня, хочется попридираться к мелочам :smirk: :grin: .
Вот копаюсь в говнокоде и встретил два куска
 

private static void flowChart1_ArrowActivated(object sender, LinkEventArgs e)
{
DiagramLink diagramLink = e.Link;
// if(a.FrameColor == Color.LightGray) return;

SelectedDiagramLink(diagramLink);

DiagramNode boxOrigin = e.Link.Origin;
DiagramNode boestination = e.Link.Destination;

int orgnindex = e.Link.OriginIndex;
int dstindex = e.Link.DestinationIndex;

for (int i = 0; i < 12; i++)
{
bool needReroute = false;
foreach (DiagramLink aa in boxOrigin.OutgoingLinks)
{
if (aa != e.Link && aa.OriginIndex == orgnindex && aa.DestinationIndex == dstindex &&
aa.Destination == boestination)
needReroute = true;
}
if (needReroute)
{
int newindex = e.Link.OriginIndex + 4;
if i + 1)%3 == 0) newindex++;
newindex = newindex%12;
e.Link.OriginIndex = newindex;
orgnindex = newindex;
}
}
}

 

private static void flowChart1_ArrowRouted(object sender, LinkEventArgs e)
{
DiagramNode boxOrigin = e.Link.Origin;
DiagramNode boestination = e.Link.Destination;

int orgnindex = e.Link.OriginIndex;
int dstindex = e.Link.DestinationIndex;

for (int i = 0; i < 12; i++)
{
bool needReroute = false;
foreach (DiagramLink a in boxOrigin.OutgoingLinks)
{
if (a.OriginIndex == orgnindex && a.DestinationIndex == dstindex && a.Destination == boestination)
needReroute = true;
}
if (needReroute)
{
int newindex = e.Link.OriginIndex + 4;
if i + 1)%3 == 0) newindex++;
newindex = newindex%12;
e.Link.OriginIndex = newindex;
orgnindex = newindex;
}
}
}

При первом же взгляде видно, что куски кода с циклом for очень похожи (с подсветкой в среде это еще более заметно но есть небольшое отличие: в первом случае присутствует "aa != e.Link".
Меня такой код сильно возмущает, но вот тут есть люди, которые готовы с таким мириться.
Интересуют мнения, как правильно переписать такой код?

Dasar

вынести как отдельный метод с флагом (Activated/Routed)

AlexV769

s/aa != e.Link/flag) ? aa != e.Link : 1)/
?

6yrop

вынести как отдельный метод с флагом (Activated/Routed)
да, хорошо.
Я сразу не заметил, что объект "e.Link" используется внутри обоих циклов, а что делать, если объект "e.Link" использовался бы только в первом случае в условии if?

klyv

так и так замедлится один из случаев, если их объединять.

6yrop

так и так замедлится один из случаев, если их объединять.
тк надо же оценивать насколько замедлиться

AlexV769

а что делать, если объект "e.Link" использовался бы только в первом случае в условии if?
вынести из цикла в булевую переменную и юзать её внутри цикла.

6yrop

вынести из цикла в булевую переменную и юзать её внутри цикла.
в условии присутствует переменная по которой идет цикл "aa != e.Link"

Dasar

а что делать, если объект "e.Link" использовался бы только в первом случае в условии if?
вместо флага добавить анонимный делегат

klyv

вместо флага добавить анонимный делегат
ой, мама...
там же всего вычеркнуть из рассмотрения один элемент надо...
анонимный делегат 100% только overhead добавит.
вгляделся повнимательней - имо, флага "исключать ли текущий Link" достаточно.

6yrop

вместо флага добавить анонимный делегат
Опа :D , ты вроде выступал с тем, что колбеки это плохо, не понятно что где выполняется и т.д.?

Dasar

колбеки - плохо
"инъекция кода" - хорошо.
колбак - подразумевает передачу управления внешней программе
инъекция - подразумевает добавление выполнения локального куска кода
event driver - это колбалки
linq - это инъекция

tokuchu

А в C# есть closures? И макросы тоже тут хорошо вписываются.

klyv

есть. а макросов нет.
Оставить комментарий
Имя или ник:
Комментарий: