Перейти к содержимому
Hes

Hes

На сайте с 5 мая 2013 г.Казахстан, Алматы

Пользователь пока ничего не рассказал о себе.

рейтинг

85

постов

18

комменты

1 305

подписчиков

14

подписок

12

Функциональный граббинг сложных сайтов (yvision.kz)

На написание статьи меня натолкнула другая статья, пользователя @web - Простой граббинг, сложных сайтов. C# (на примере Yvision.kz). В этой статье показано императивное решение задачи, я же задался вопросом - можно ли решить задачу, используя смешанные парадигмы, в частности функциональная (Linq) и императивная (ООП)? Как оказалось - можно. Для этого я изначально поставил вопрос - что я хочу видеть в итоге? Есть сайт - Yvision, есть БД, куда надо будет сливать список статей, аналогично вышеуказанной статье, остается лишь мелочь - что же всё-таки мы будем сливать в БД? Для этого был создан POCO-класс Yvision, который и будет характеризовать данные, которые мы хотим получить от сайта и которые мы будем записывать в БД. public class Yvision { /// <summary> /// Идентификатор статьи ///…

-8
3
755

Монада IO в C#.

1. Что такое монада? (вики) Мона́да в функциональном программировании — это абстракция линейной цепочки связанных вычислений. Её основное назначение — инкапсуляция функций с побочным эффектом от чистых функций, а точнее их выполнений от вычислений. Монада IO (монада строго последовательных вычислений): стратегия связывания — «сначала первое вычисление, затем второе»; Пример применения монады IO: public XElement LoadXml(string url) { return IO.Apply(() => Load(url)) .Map(ToXElement) .Map(ToStorage) .Map(SendNotify) .Run(); } 2. Необходимое дополнение о чистоте функций. Чтобы функция считалась чистой, необходимо, чтобы выполнялись следующие условия: Получать одинаковый результат вычислений при одинаковых исходных данных и не выполнять изменений состоянияВычисление не должно вызывать види…

-9
0
918

Простое преобразование Xml документа при помощи Linq2Xml.

Недавно мне потребовалось преобразовать Rss в Xml нужного мне вида, для загрузки во временный кэш (ресурс с которого выкачивается Rss может быть не доступен, а данные нужны здесь и сейчас). Для этого мне понадобился всего лишь Linq2Xml. public XElement Select() { return new XElement("root", new XAttribute("key", "news_cache"), XElement .Load("rss_url") .Element("channel") .Elements("item") .Take(5].ToInt()) //Нужно всего 5 новостей .Select(i => new XElement("news", new XAttribute("title", i.Element("title").Value), new XAttribute("link", i.Element("link").Value), new XAttribute("pubDate", i.Element("pubDate").Value), new XAttribute("description", i.Element("description").Value)))); } Пояснения к коду 1. Статический, защищенный от исключительных ситуаций, метод ToInt (преобразует строку…

-9
0
645

Различия императивного и функционального программиста.

Или как различный подход в выборе парадигмы проектирования влияет на проект в целом. Все, кто изучал только императивное программирование (к нему относится и ООП), т.е. не изучал специально функциональное или логическое программирование, размышляя о программе или алгоритме, мыслят категориями «как сделать», а не «что сделать». Но "императивный программист" - это всего лишь образ мышления, а не приговор. Для того, чтобы писать высокоэффективные функциональные программы, обладающие таким признаком как отсутствие побочных эффектов (в отличие от императивных аналогов), необходимо перестроить сознание и это является большой проблемой - перестройка сознания на мышление категориями «что сделать» и, соответственно, восприятия кода, написанного в манере «что требуется получить», а также нескольких…

-8
0
441

Для чего нужен Select в Linq.

Метод Select - используется для получения новой последовательности из исходной, путем трансформации каждого элемента последовательности в новую форму. Пример из MSDN (101 Linq samples): public void Linq6() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var numsPlusOne = from n in numbers select n + 1; Console.WriteLine("Numbers + 1:"); foreach (var i in numsPlusOne) { Console.WriteLine(i); } } Можно переписать так: var numsPlusOne = numbers.Select(n=>n+1). Метод SelectMany. Пример из проекта. Мне необходимо искать все существующие работающие сетевые интерфейсы, за исключением локального и извлекать свойства каждого интерфейса. Суть в том, что у каждого интерфейса может быть множество свойств. Поэтому здесь очень хорошо подойдет метод SelectMany. Применение SelectMany public static…

-9
0
850

Простой функциональный калькулятор.

Механизм делегатов в .NET - очень обширная тема и существует множество способов его применения, от элементарных до, например реализации поставщика данных IQueryable - http://msdn.microsoft.com/ru-ru/library/bb546158.aspx. Пока до этого не дошел, так как материал не самый лёгкий для восприятия, ограничиваюсь более простыми конструкциями:) Итак. К примеру, есть задача написать нечто, подобное калькулятору для консольного приложения. Как правило программа ожидает такой пользовательский ввод: первое число, операция, второе число. Многие не заморачиваясь, пишут нечто подобное: switch (operation) { case "+": Console.WriteLine("{0}", x + y); break; case "-": Console.WriteLine("{0}", x - y); break; case "*": Console.WriteLine("{0}", x * y); break; case "/": Console.WriteLine("{0}", x / y); break;…

-8
0
517

Немного функциональности в C#

Простенькое: public static int ToInt(this string value, int @default = 0) { int result; return int.TryParse(value, out result) ? result : @default; } Такая запись позволить получить результат вне зависимости от value. И дальше возможно использовать так: var i = "123".ToInt(); var j = "1qwerty".ToInt(100); Чуть посложнее. Немного Linq. Предположим, что у нас есть некоторое перечисление - IEnumerable и мы хотим произвести некоторые действия над ним без использования foreach. У каждого перечисления есть метод материализации списка - ToList, т.к. сам по себе IEnumerable - ленивый. У класса List<T> есть метод ForEach, который позволяет производить некоторую операцию с каждым элементом списка, при этом не меняя сам список. На вход метода подается делегат Action<T>, который можно пер…

-9
0
571