frontman
|
Дата: 29.11.2011
Ну это понятно...
|
|
|
|
frontman
|
Дата: 07.12.2011
|
|
|
|
Хотел бы поднять следующий вопрос связанный со стилем написания кода. Используйте анонимные методы с умом Большинство опытных разработчиков знает, что не нужно бросаться с руками и ногами на каждую новомодную фишку языка программирования и использовать ее где попало. То же самое относится и к анонимным методам. Анонимные методы – это очень полезная возможность, которая может как существенно упростить понимание кода, так и усложнить его. Не существует формальных правил, которые бы определяли, когда следует применять анонимные методы, а когда лучше создать обыкновенный именованный метод (хотя Джеффри Рихтер придерживается правила, что любой анонимный метод длиннее 3-х строк должен быть преобразован в именованный). Анонимный метод есть смысл использовать в том случае, когда он является логической частью какого-то другого метода и не имеет особого смысла без этого контекста. Если же метод является самостоятельным, полностью выполняет некоторую задачу и может вызываться в различных условиях, то стоит подумать о создании именованного метода.Это замечание я вычитал вот тут http://rsdn.ru/article/c...rp/Closure_in_Csharp.xml и по моему оно очень справедливо... Из за на мой взгляд не совсем корректного использования анонимных методов понимание кода ОЧЕНЬ усложнено...
|
|
|
|
Alexander
|
Дата: 07.12.2011
Цитата:метод является самостоятельным, полностью выполняет некоторую задачу и может вызываться в различных условиях, то стоит подумать о создании именованного метода. можно пример где у нас есть такое и не выделено в полноценный метод?
|
Автор топика
|
|
|
frontman
|
Дата: 07.12.2011
В PazaTrader много такого... Код
private void OnSessionContentsDerivativeStreamInserted(PlazaRecord record, PlazaSessionContentsDerivativeColumns metadata, Action<Security> handler)
{
ProcessEvents(() =>
{
var secCode = record.Get<string>(metadata.ShortIsin);
var isinId = record.Get<int>(metadata.IsinId);
if (_isinIds.Add(isinId))
{
GetSecurity(CreateSecurityId(secCode, "RTS"), security =>
{
InitSecurityInfo(security, record, metadata);
security.Code = secCode;
handler(security);
}, isinId.ToString());
}
});
}
|
|
|
|
frontman
|
Дата: 07.12.2011
|
|
|
|
А вот мое любимое место:)) Код
private void OnOrdersLogStreamEnd(PlazaStream stream)
{
ProcessEvents(() => _orderBuilder.FlushChanges(stream, (security, metadata, firstRecord, lastRecord) => GetOrder(security, firstRecord.Get<long>(metadata.OrderId), orderId =>
{
var transactionId = firstRecord.Get<int>(metadata.ExtId);
//http://forum.rts.ru/viewtopic.asp?p=115933
//10. Изменен порядок прихода записей по итогам торговой транзакции в логе заявок.
//Ранее при постановке заявки первой шла запись о постановке заявки инициатора транзакции,
//вслед за которой шли записи о сделках.
//В версии 3.8 запись о постановке заявки добавляется последней, после записей о сделках.
var order = GetOrderByTransactionId(transactionId);
if (order != null)
order.Id = orderId;
else
order = EntityFactory.CreateOrder(orderId);
order.Security = security;
var restVolume = firstRecord.Get<decimal>(metadata.AmountRest);
var initVolume = firstRecord.Get<decimal>(metadata.AmountOperation);
order.Price = firstRecord.Get<decimal>(metadata.Price);
order.Volume = initVolume;
order.Balance = restVolume;
order.Direction = firstRecord.Get<int>(metadata.Direction) == 1 ? OrderDirections.Buy : OrderDirections.Sell;
order.Portfolio = GetPortfolio(firstRecord.Get<string>(metadata.ClientCode));
order.Comment = firstRecord.Get<string>(metadata.Comment);
order.TransactionId = transactionId;
order.Time = firstRecord.Get<DateTime>(metadata.Moment);
order.State = restVolume == 0 ? OrderStates.Done : OrderStates.Active;
var status = firstRecord.Get<int>(metadata.Status);
if ((status & 0x01) == 0x01)
order.ExecutionCondition = OrderExecutionConditions.PutInQueue;
else if ((status & 0x02) == 0x02)
order.ExecutionCondition = OrderExecutionConditions.CancelBalance;
return order;
},
order =>
{
var action = lastRecord.Get<int>(metadata.Action);
switch (action)
{
case 0: // удалена
order.CancelTime = lastRecord.Get<DateTime>(metadata.Moment);
order.Balance = lastRecord.Get<int>(metadata.AmountOperation);
order.State = OrderStates.Done;
break;
case 1: // добавлена
break;
case 2: // исполнена
order.Balance = lastRecord.Get<decimal>(metadata.AmountRest);
if (order.Balance == 0)
order.State = OrderStates.Done;
break;
default:
throw new InvalidOperationException("Неизвестное действие заявки {0}.".Put(action));
}
FillExtensionInfo(order, lastRecord);
})));
}
|
|
|
|
frontman
|
Дата: 07.12.2011
Тут 4 анонимных метода... причем некоторые вложены друг в друга... Оч сложно для понимания...
|
|
|
|
Alexander
|
Дата: 07.12.2011
frontman  В PazaTrader много такого... Код
var secCode = record.Get<string>(metadata.ShortIsin);
var isinId = record.Get<int>(metadata.IsinId);
if (_isinIds.Add(isinId))
{
GetSecurity(CreateSecurityId(secCode, "RTS"), security =>
{
InitSecurityInfo(security, record, metadata);
security.Code = secCode;
handler(security);
}, isinId.ToString());
}
и может вызываться в различных условияхГде это ещё используется? Кроме данного места?
|
Автор топика
|
|
|
frontman
|
Дата: 07.12.2011
Александр смысл этой фразы в том что в общем не стоит злоупотреблять анонимными методами)) Мне кажется их слишком много...
|
|
|
|
Alexander
|
Дата: 07.12.2011
frontman  Александр смысл этой фразы в том что в общем не стоит употреблять анонимными методами)) Мне кажется их слишком много... Смысл этой фразы ровно как и написано - в том, что в методы стоит выделять то, что может быть использовано где-то ещё. Додумывать не стоит. Данное место и с ордерами - единственное где используется. Если используется в нескольких местах - выделяется в отдельные методы, ровно как и должно быть. Собственно поработайте поплотнее с кодом, сложного и непонятного там ничего нет. С ордером - второй => - создание ордера, третий - обновление. Ну первый и так понятно. Смысл плодить методы, которые никто никогда не будет использовать кроме одного единственного места?
|
Автор топика
|
|
|
frontman
|
Дата: 07.12.2011
Ну. Александр я просто попытался поднять вопрос который лично мне мешает при понимании кода... Если ни кто больше не считает что в этом ест проблема то ладно. Я правда думаю что на текущий момент кроме меня, вас и Михаила туда ни кто и не заглядывает(Я о плазе)...
|
|
|
|
Alexander
|
Дата: 07.12.2011
frontman  Ну. Александр я просто попытался поднять вопрос который лично мне мешает при понимании кода... Если ни кто больше не считает что в этом ест проблема то ладно. Я правда думаю что на текущий момент кроме меня, вас и Михаила туда ни кто и не заглядывает(Я о плазе)... Ну. А я просто попытался объяснить почему не стоит плодить методы которые никто не будет использовать :)
|
Автор топика
|
|
|
frontman
|
Дата: 07.12.2011
Ну хотя бы для того что бы не загромождать вызов функций передачей анонимных методов... Очень сложно уследить где один метод заканчивается а где начинается другой, а где передается параметр...
|
|
|
|
Mikhail Sukhov
|
Дата: 07.12.2011
frontman  Ну хотя бы для того что бы не загромождать вызов функций передачей анонимных методов... Очень сложно уследить где один метод заканчивается а где начинается другой, а где передается параметр... Смысл анонимных методов как раз в том, чтобы такие вещи не отслеживать, как то, где он заканчивает, и что передается. Поэтому и придумали замыкания. А вообще C# с каждой новой версией становиться функциональным языком. Лямбды и замыкания - это свойство функциональности. В 4-ой версии параллелинг стал частью языка. Поэтому лямбды будут все больше и больше использоваться. Статья годичной давности. Хотел бы я узнать, как у автора дела на текущий момент с await и async. И не напишет ли он новую статью, что лямбды рулят и только их и нужно использовать.
|
|
|
|
frontman
|
Дата: 07.12.2011
)) Ну.. await и async разве не в 4.5 появятся только?
|
|
|
|
Mikhail Sukhov
|
Дата: 07.12.2011
frontman  )) Ну.. await и async разве не в 4.5 появятся только? Аффтар MVP. Этот народ изучать начинает 4.5 когда еще 3.0 не вышла.
|
|
|
|
frontman
|
Дата: 07.12.2011
Ну понял. Вопрос значит закрыт... Но есть еще один) Теперь уже по логике работы плазы)) А разве при вызове метода Trader.Reconnect данные по инструментам не должны снова поступить?
|
|
|
|
Mikhail Sukhov
|
Дата: 07.12.2011
frontman  Ну понял. Вопрос значит закрыт... Но есть еще один) Теперь уже по логике работы плазы)) А разве при вызове метода Trader.Reconnect данные по инструментам не должны снова поступить? Не должны. У нас ссылочная целостность. Перезакачка данных - это от лукавого.
|
|
|