stdray: (Default)
stdray ([personal profile] stdray) wrote2012-02-07 04:32 pm

Полотно

Вот такие штуки почему-то всегда работают с первого раза. Хотя наверное за такое надо закапывать.

  1. public static IList<Package> ReadAndWriteAisTickets(string _) {  
  2.     const string xmlExt = "xml";  
  3.     const string zipExt = "zip";  
  4.     using (var pop = new Pop3Client()) {  
  5.         pop.Connect(Settings.Default.MailHost, Settings.Default.MailPop3Port, Settings.Default.MailSsl);  
  6.         pop.Authenticate(Settings.Default.MailUser, Settings.Default.MailPassword);  
  7.         var messageCount = pop.GetMessageCount() + 1;  
  8.         foreach (var i in 1.To(messageCount)) {  
  9.             var message = pop.GetMessage(i);  
  10.             var attachments = message.FindAllAttachments();  
  11.             var xmlFromXml = attachments.Where(a => a.FileName.EndsWith(xmlExt))  
  12.                                         .Select(a => a.GetBodyAsText())  
  13.                                         .TrySelect(XElement.Parse);  
  14.             var xmlFromZip = attachments.Where(a => a.FileName.EndsWith(zipExt))  
  15.                                         .TrySelect(a => ZipFile.Read(new MemoryStream(a.Body)))  
  16.                                         .TrySelectMany(ExtractsFromZip)  
  17.                                         .Select(s => s.ToXElement());  
  18.             var packages = xmlFromXml.Concat(xmlFromZip)  
  19.                                      .TrySelect(e => e.DeserializeFromXml<TransportPackage>())  
  20.                                      .Where(tp => !tp.IsEmpty())  
  21.                                      .Select(tp => tp.ToDbPackage());  
  22.             using (var db = Env.GetDbPackages()) {  
  23.                 db.Connection.Open();  
  24.                 db.Transaction = db.Connection.BeginTransaction();  
  25.                 packages.ForEach(db.WritePackage);  
  26.                 db.SubmitChanges();  
  27.                 try {  
  28.                     pop.DeleteMessage(i);  
  29.                     db.Transaction.Commit();  
  30.                 }  
  31.                 catch { db.Transaction.Rollback(); }  
  32.             }  
  33.         }  
  34.         return new List<Package>();  
  35.     }  
  36. }  

[identity profile] hls-1141.livejournal.com 2012-02-07 05:42 pm (UTC)(link)
а что тут не так?

[identity profile] stdray.livejournal.com 2012-02-07 06:04 pm (UTC)(link)
1) Огромные нечитаемые лямбды, которые "невозможно дебажить".
2) Не экранирована часть методов (смотри всякие pop.BlahBlahBlah() где-то в начале)
3) Не пробрасываются человекопонятные исключения
4) Нет логирования

Но пока мне пофиг. Ф принципе, я эта функция как и ей подобные передается в качетсве аргумента ФВП, которая экранирует и логирует, если чо. Эта байда только на сервере крутится будет, а мне стэктрэйса достаточно, чтобы подебажить.

[identity profile] stdray.livejournal.com 2012-02-07 06:09 pm (UTC)(link)
Олсо, разная мутная еба вроде 1.To(n) или TrySelect(x=>f(x)).