Архив метки: Информационные технологии

Hype Driven Development

Hype Header

Перевод одноименной статьи Marek Kirejczyk из daftcode.pl.

Команды разработчиков программного обеспечения часто принимают решения о программной архитектуре или базовом технологическом стеке на основе спорных мнений из социальных медиа, да и в целом выбирая то, что считается «горяченьким», вместо того, чтобы провести скрупулезное исследование и серьезно рассмотреть возможный эффект от их применения на своих проектах. Я называю эту тенденцию Hype Driven Development (прим. разработка управляемая беззастенчивой рекламой или обманом, но обман… в общем я склонен считать что хайп это хайп, но в переводе иногда буду использовать другие слова), считаю ее вредной и выступаю за более профессиональный подход, который называю «Solid Software Enginering». Приглашаю узнать больше о том, как это работает, и выяснить, что можно сделать вместо этого [HDD].

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Про git flow в разработке

В общем-то история будет о том, на что стоит обратить внимание, когда решился использовать git-репозиторий, как его удобно приготовить и зачем нужны все эти плюшки.

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

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Про автоматизацию

— Смотрите, мы уже 100 лет рубим лес стальными топорами. Нам нужно усовершенствовать инструменты, чтобы мы могли заготавливать больше леса.

— Хорошо, вот супер-новая пила, работающая на холодном синтезе, заряда хватит на несколько сотен лет.

— Эта ваша пила совершенно не удобная и плохо работает.

— Почему неудобная, ведь с её помощью можно заготавливать больше леса и она не требует ни топлива, ни подзарядки?

— Нет нельзя, она тяжелее топора и лесорубы устают ей махать, а эта цепь очень плохо рубит дерево.

— Но это пила, ей не надо махать, просто уприте её вот так и направляйте.

— Не учите нас рубить лес, мы уже 100 лет рубим лес, просто сделайте нам на пиле лезвие как у топора.

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Создание простейшей WCF-службы. Часть 3.

Примечание автора: эта статья была написана в районе 2008 года, и, скорее всего, она уже морально устарела. Однако, судя по отзывам, все еще кому-то полезна. Статья разделена на несколько частей.

Часть 1, Часть 2, Часть 3

Создание клиентского приложения WCF

Итак, настало время создать клиентское приложение и попробовать нашу службу в действии.

Добавим в наше решение новый проект — консольное приложение Windows и назовем его CalcClient.

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Создание простейшей WCF-службы. Часть 2.

Примечание автора: эта статья была написана в районе 2008 года, и, скорее всего, она уже морально устарела. Однако, судя по отзывам, все еще кому-то полезна. Статья разделена на несколько частей.

Часть 1, Часть 2, Часть 3

Реализация сервиса

Итак, мы создали контракт нашей службы, теперь нужно этот контракт реализовать. Сразу переименуем файл Service1.cs в CalcService.cs (VS спросит, хотите ли вы переименовать тип, хранящийся в файле — нужно согласиться) и откроем его.

В xml-комментарии перед описанием класса сервиса видим то же самое предупреждение, что и в случае с интерфейсом. Удаляем его, а также все автоматически сгенерированное содержимое класса — оно нам не понадобится.

Теперь переводим курсор на имя наследуемого интерфейса, нажимаем Alt+Shift+F10 и в появившемся меню выбираем Implement interface ‘ICalcService’. Осталось лишь реализовать наш метод Calc:

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Создание простейшей WCF-службы. Часть 1.

Примечание автора: эта статья была написана в районе 2008 года, и, скорее всего, она уже морально устарела. Однако, судя по отзывам, все еще кому-то полезна. Статья разделена на несколько частей.

Часть 1, Часть 2, Часть 3

Введение

Эта статья для тех, кого заинтересовала технология WCF, и те преимущества, которые она дает разработчику распределенных и сервис-ориентированных приложений.

Сегодня я расскажу о том, как создать простейшую WCF-службу. Для примера будем использовать классический вариант — калькулятор.

Создание службы

Для создания нашего приложения мы будем использовать Visual Studio 2008. Итак, вызовем диалоговое окно создания нового проекта и выбираем шаблон проекта под названием «WCF Service Library» и дадим ему имя «WcfCalcService».

Проект сейчас состоит из трех основных файлов. Посмотрим, за что каждый из них отвечает.

1. App.config — файл конфигурации приложения. В этом файле также находятся настройки службы;

2. IService1.cs — файл с интерфейсом (контрактом) службы;

3. Service1.cs — файл с классом, реализующим интерфейс (т.е. функционал службы).

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

А как Вам метод, тело которого начинается с return?

Друг похвастал какие чудеса он пишет в коде, на работе. Хороший пункт в тему того, почему у разработчика нельзя оставлять наедине с кодом, ему нужен хотя бы еще один в команду, чтобы попинывал и мотивировал.

Готов поиграть в игру: Кто сможет дать максимально подробное описание или комментарии к данному коду или переписать его максимально просто для человеческого прочтения? И сколько на это понадобится времени?

private List<BlankComposition> GetBlankInfo(SKDREntities db, Requisition inz, int deliveryType, long? languageId)
        {
            return db.RuleDescriptions
                .Where(rd => rd.OrganizationId == inz.ReqUnit && rd.IsActive)
                .ToList()
                .Where(rd => rd.DeliveryTypes.Split(',').Select(int.Parse).Contains(deliveryType))
                .DefaultIfEmpty()
                .SelectMany(or => db.RuleDescriptions
                    .Where(rd => rd.OrganizationId == inz.RequisitionOrg.OrgID && rd.IsActive)
                    .ToList()
                    .Where(rd => rd.DeliveryTypes.Split(',').Select(int.Parse).Contains(deliveryType)).DefaultIfEmpty(), (org, lab) => new { org, lab })
                .Select(rule => new[] { rule.org, rule.lab }.Where(r => r != null).ToList())
                .Select(rule => new
                    {
                        HeadHeight = rule.Select(r => r.Composition.HeaderHeight).FirstOrDefault(hh => hh != null) ?? "3cm",
                        FooterHeight = rule.Select(r => r.Composition.FooterHeight).FirstOrDefault(fh => fh != null) ?? "4.5cm",
                        DemographyDescriptionId = rule.Select(r => r.DemographyDescriptionId).FirstOrDefault(),
                        Suffix = rule.Select(r => r.Suffix).FirstOrDefault(),
                        Elements = rule
                                    .SelectMany(
                                        re => re.Composition.CompositionElements,
                                        (rd, element) => new { element, priority = rd == rule.First(), langPriority = element.LanguageId == languageId }
                                    )
                                    .GroupBy(g => g.element.ElementTypeId)
                                    .SelectMany(g => g
                                        .OrderByDescending(e => e.priority)
                                        .ThenByDescending(e => e.langPriority)
                                        .Take(1)
                                        .Select(e => e.element)
                                    )
                                    .Where(e => e.ElementId != null)
                                    .ToList()
                    }
                ).Select(item => new BlankComposition
                    {
                        HeaderHeight = item.HeadHeight,
                        FooterHeight = item.FooterHeight,
                        BlankElements = item.Elements.Select(e => new BlankElement
                        {
                            Width = e.Element.Width,
                            Height = e.Element.Height,
                            Left = e.Element.Left,
                            Top = e.Element.Top,
                            Image = e.Element.ImageId == null ? null : e.Element.Image.Data,
                            Text = e.Element.Text,
                            Placing = e.Placing
                        }).ToList(),
                        Demography = db.DemographyDescriptions
                            .Single(dd => dd.Id == item.DemographyDescriptionId)
                            .DemographyTables
                            .Select(dt => new DemographyInfo
                            {
                                Placing = dt.Placing,
                                Height = dt.Height,
                                Left = dt.Left,
                                Top = dt.Top,
                                Width = dt.Width,
                                Lines = DemographyFormatter.GetDemographyInfo(inz, dt.DemographyType.DemographyContents.OrderBy(o => o.SortOrder).ToList())
                            })
                            .ToList(),
                        Suffix = item.Suffix,
                        AddHyperlinks = item.Elements.Any(hy => hy.ElementTypeId == 6 && hy.ElementId != null)
                    }
                ).ToList();
        }

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.