Написання функціонального коду на мові С #

Мова С # в основному є імперативним мовою програмування, що озна, що він головним чином працює з змінами стану Але в С # 30 Ніна проявлятися і функціональний аспект Метою функціонального програірованія є створення коду, що не викликає побічних ефектів Багато хто з попередніх глав містили аспекти функціонального програмування, не називаючи їх явно такими У цій главі розглядається виключно предмет функціонального програмування

У главах 9 а 11 були розглянуті узагальнення NET і лямбда-вирази в контетом С # Ми навчилися використовувати ці можливості для вирішення проблем обктно-орієнтованим способом У цьому розділі ми розглянемо, як використовувати ці можливості для вирішення проблем в контексті функціонального программованія (Якщо вам потрібно освіжити ваші знання узагальнень NET і лямбдираженій, то повторіть матеріал у главах 9 і 11, перш ніж продовжувати з Ізен цієї глави)

Можливо, вам доводилося чути думку, що функціональний программіраніе є складним предметом Я думаю, що функціональний программіраніе – не більше складний предмет, ніж, скажімо, програмування потоків або розробка і реалізація компонентів Але функціональне програмування являє собою інший стиль програмування Ситуація з функціональним програмуванням подібна до ситуації, коли програміст вперше стикається з обєктно-орієнтованим кодом Цей предмет також спочатку здається слоим, т к в ньому вводяться нові поняття

Для першого знайомства з функціональним програмуванням я рекомендую переглянути відеоінтервю, в якому Андерс Хайлсберг (Anders Hejlsberg) оуждает LINQ і функціональне програмування Андерс є творцем Delphi і С # (для додаткової інформації див Web-сайт http://enwikipediaorg/ wiki/Anders_Hejlsberg) Враження про функціональне програмуванні, яке

я отримав від цього інтервю, можна виразити одним рядком: Написання коду, що не має побічних ефектів.

Написання коду, що не має побічних ефектів, є функціональним програм ірованія

Програмування, при якому код має побічні ефекти, є імперівним програмуванням Мова С # є мовою імперативного програірованія Імперативне програмування означає написання коду, який модифікує стан Прикладом імперативного програмування може служити наступний фрагмент коду:

int х = 0 х = х + 1

Даний код оголошує змінну х, після чого додає 1 до значення цієї змінної, таким чином, виконуючи операції, модифікують стан Звичайно ж, це здається занадто очевидним зрештою, для вирішення прлеми необхідно модифікувати стан

Тепер подивимося на приклад побічних ефектів, створюваних імперативним програмуванням:

class SomeObject { public int Value

}

class AnotherObjectThatEmbedsSomeObject { SomeObject _child

public AnotherObjectThatEmbedsSomeObject(SomeObject child) {

_child = child

}

void MyMethodO {

_ChildValue = 10

}

}

Припустимо, у нас є наступний метод:

void SomeMethod(AnotherObjectThatEmbedsSomeObject obj) { objMyMethod()

}

У даному випадку виклик методу MyMethodO створює побічний ефект зміни значення SomeObject Value на 10 В чолі б були продемонстровані високі якості такого типу коду, т к він приховує інформацію і дозволяє типом AnotherObjectThatEmbedsSomeObject фокусуватися на маніпулюванні обєктах-

тому someobject без перешкод Але ці високі якості є палицею на два Коахо, т к вони викликають побічні ефекти, про які код, що викликає метод someMethod (), нічого не знає (Звичайно ж, можна сперечатися, що потрібно було здати, щоб обєкт AnotherObjectThatEmbedsSomeObject ЗНЕЛ Про потоках, АЛЕ метою даного прикладу було проілюструвати побічні ефекти)

Теоретично, компонентно-орієнтований підхід дозволяє створення інфртруктури, яку можна застосовувати для вирішення декількох проблем Скажімо, що ви збираєтеся пофарбувати будинок Один з варіантів виконання цього завдання – встановити лісу навколо будинку Це буде більш безпечним способом, але робітники будуть змушені стежити за іншими робітниками Крім цього, установка та знесення лісів займає досить значне час Ліси можна порівняти з імператив підходом, де нам потрібно брати до уваги багато обставин, включаючи паралельне виконання

Альтернативою лісам при фарбуванні будинку буде використання драбини кожним маляром Сходи набагато швидше встановити і прибрати, ніж лісу, і вони позвяют кожному маляру працювати незалежно від інших (за Принаймні, на своїй сходах) Але недоліком використання сходів є необхідність перещать їх на нову ділянку, приділяти увагу установці їх належним чином і в той же самий час не випускати з уваги головну задачу фарбування будинку Ісполованіе сходів буде аналогічно функціональному підходу

У той час як написання коду, що не має побічних ефектів, є воожним, це безпосередньо конфліктує з імперативним програмуванням Код, в якому не допускається ніяких побічних ефектів, повинен зберігати всі даие в стеку, що не завжди можливо і може бути досить сбивающим з пантелику Користь імперативного і обєктно-орієнтованого програмування полягає в тому, що вони розбивають код на ізольовані модулі, дозволяючи написання коду, сфокусованого на певну проблему

Як правило, обєктно-орієнтовані методики застосовуються для створення елементів функціональності, які обробляють дані, а методики фуніонального програмування застосовуються в тих обставинах, коли дані не піддаються легкому опису або проблему не можна вирішити за допомогою обєктах-орієнтованих підходів Наприклад, в прикладі контролера освітлення, рамотренного в чолі 8, реалізації індивідуальних кімнат і угруповань кімнат були б залишені у вигляді компонентів Також було б залишено ядро, яке працює з індивідуальними кімнатами і угрупованнями кімнат У даному слае застосування функціонального програмування не принесло б ніякої користі З іншого боку, приклад електронної таблиці в чолі 11був би пррасним кандидатом для застосування функціонального програмування Ідея даного прикладу полягає у взаємодії з різними повязаними ЕЛЕНТ інформації, що важко зробити за допомогою обєктно-орієнтованих підходів Інший ситуацією, що підходить для застосування функціонального прраммірованія, буде завдання визначення самого короткого маршруту між двома

містами, розглянута в чолі 4 Там проблема полягала в застосуванні рекурсії і запамятовування вже розглянутих маршрутів

Таким чином, в одних випадках потрібне застосування імперативних методів, а в інших – функціональних Можна сказати, що обєктно-орієнтоване програмування частіше повязане з вирішенням проблем з даними і структурами даних, в той час як функціональне програмування – зі створенням алгітмов, які працюють зі структурами даних

У кінцевому рахунку, ні функціональне, ні імперативне програмування не яяется кращим рішенням для всіх проблем Функціональне програмування має свої переваги, також і як і імперативне програмування Решіем, пропонованим мовою С #, є гібрид, що дозволяє обєднувати МЕТИК функціонального і імперативного програмування

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*