Thursday, April 26, 2018

A copy paste, when it accumulated just search it to fix.

public class AutonomeDuplicates
    {
        public class LineInfo
        {
            public string FileName { get; set;}
            public int LineNumber { get; set;}
        }

        public class Lines : List<LineInfo>
        {
            public string Text  { get; set;}
        }
    

        public static void Execute (string[] args)
        {
            //"/home/user/Projects/operation_control/" "*.c" "False" "/home/user/Projects/operation_control/log_duplicates"
            var folder = args[0];
            var ext = args[1];
            var allFiles = Convert.ToBoolean(args[2]);
            var output = args[3];

            File.Delete(output);

            var files = Directory.GetFiles(folder, ext, SearchOption.AllDirectories);

            var hashes = new Dictionary<int, Lines> ();
            var regex = new Regex(@"\s+");

            foreach (var file in files) {
                var lines = File.ReadAllLines (file);
                int lineNumber = 0;
                foreach (var in lines) {
                    var line = regex.Replace(l.Trim (), " ");
                    var hash = line.GetHashCode ();

                    if (hashes.ContainsKey (hash)) {
                        hashes [hash].Add (new LineInfo{ FileName = file, LineNumber = lineNumber });
                    } else {
                        hashes.Add (hash, new Lines { new LineInfo{ FileName = file, LineNumber = lineNumber } });
                        hashes [hash].Text = line;
                    }
                    lineNumber++;
                }
            }

            var results = hashes
                .Select (h => h.Value)
                .Where(c => c.Count > 1)
                .Where(c => !string.IsNullOrWhiteSpace(c.Text) &&
                    !c.Text.Contains("#include"));

            var siblings = results.Where (c => c.Any (li => results.Any (c1 => c1.Any (li1 => (li.LineNumber == li1.LineNumber + 1
            || li.LineNumber == li1.LineNumber - 1) && li.FileName == li1.FileName))));

            foreach (var result in siblings) {
                File.AppendAllText (output, string.Format ("{0}\ncount{1}", result.Text, result.Count));
            }
        }
    }

Thursday, April 12, 2018

Roslyn Is Better for Code Generation

Roslyn лучше ведет себя в генерации кода, чем T4. Таким образом , T4 плохо приспособлен к сложной логике условий, очень часто встречающейся в бизнес логике. T4 основывается на шаблонах, что говорит о том, что генерируемый код должен соответствовать заранее определенному описанию. Но так бывает не всегда, при определении всех нюансов бизнес правил. И конечно, Roslyn лучше ведет себя чем CodeDom потому, что CodeDom не поддерживает всех нововведений языка, таких как Linq и лямбда выражения. Roslyn полностью поддерживает все новые конструкции языка и с помощью его можно генерировать такой код, как вы задумали.

Перевод из книги: Code Generation with Roslyn by Harrison, Nick

Для того чтобы генерировать код из существующих примеров, можно использовать Roslyn Quoter. Его автор Kirill Osenkov участвует в контроле качества Roslyn и Visual Studio.

Вот такой код с сообщениями бота описывается с помощью Roslyn Quoter в 333 строки, но зато в цикле из Excel таблицы он будет на много компактнее.


public class Str

{

public const string cStrHi = "Hi, I'm CakeBot";

public const string cStrNameQ = "What is your name?";

public const string cStrName = "Name";

public const string cStrGetName = "GetName";

public const string cStrWhen = "When would you like the cake delivered?";

public const string cStrProcessingReq = "Thanks for using our service. Delivery has been scheduled for: ";

public const string cStrDontUnderstand = "I'm sorry I don't understand what you mean.";

public const string cStrQuantity = "How many?";

public const string cStrOptions = "Now or Tomorrow";

public const string cStrDeliverBy = "Deliver by: ";

public static string[] DeliverTypes = new string[] { "Now", "Tomorrow" };

public static string[] CakeTypes = new string[] { "Cup Cake", "Triple Layer Cake", "Cream Cake" };

public static string cStrNoPush = "NO_PUSH";

public static string cStrTemplateType = "template";

public static string cStrPayloadTypeGeneric = "generic";

}




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

Список библиотек и проектов основанных на Roclyn, в нем можно найти утилиты для быстрого развертывания адаптивной инфраструктуры.

debug magazine archive

  71 jounals still available on issuu with great story of netlabels time.  debug_mag Publisher Publications - Issuu