UML-эквиваленты для функциональных и итерационных парадигм [дубликат]

Как способ удаления недопустимых символов XML, я предлагаю вам использовать метод XmlConvert.IsXmlChar . Он был добавлен с .NET Framework 4 и представлен также в Silverlight. Вот небольшой пример:

void Main() {
    string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    content = RemoveInvalidXmlChars(content);
    Console.WriteLine(IsValidXmlString(content)); // True
}

static string RemoveInvalidXmlChars(string text) {
    var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
    return new string(validXmlChars);
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

И как способ избежать недопустимых символов XML, я предлагаю вам использовать метод XmlConvert.EncodeName . Вот небольшой пример:

void Main() {
    const string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    string encoded = XmlConvert.EncodeName(content);
    Console.WriteLine(IsValidXmlString(encoded)); // True

    string decoded = XmlConvert.DecodeName(encoded);
    Console.WriteLine(content == decoded); // True
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

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

45
задан Mauricio Scheffer 16 March 2010 в 22:04
поделиться

9 ответов

Функциональные программисты, как правило, не очень полезны для диаграмм. Многие функциональные программисты (но не все) обнаруживают, что запись типов - хороший способ инкапсулировать конструктивные отношения, которые программисты OO помещают в диаграммы UML.

Поскольку изменчивое состояние встречается редко в функциональных программ нет «изменяемых» объектов, поэтому обычно не полезно и не нужно связывать диаграммы между ними. И хотя одна функция может вызвать другую, это свойство обычно не важно для общего дизайна системы, а только для реализации функции, выполняющей вызов.

Если бы я чувствовал сильную потребность в диаграмме a я мог бы использовать концептуальную карту , в которой типы или функции играют роль понятий.

31
ответ дан Norman Ramsey 20 August 2018 в 14:34
поделиться
  • 1
    Спасибо Норман, немного рекурсивный вопрос, но я думаю, что вы ответили, что я чувствую себя очень красноречиво. – WeNeedAnswers 17 March 2010 в 13:44
  • 2
    пересматривая это, я думаю, что неизменяемые типы могут быть смоделированы. Затем вы можете передать эти неизменяемые объекты в функции, которые действуют на них, создавая новый вывод. Этот вопрос, который я написал, был для проекта, над которым я работал. В конце я использовал UML, но разбил объекты на функции и неизменные типы. Это сработало. – WeNeedAnswers 12 October 2010 в 04:04
  • 3
    Мне любопытно, если этот ответ по-прежнему верен сегодня. Как справляется сложность? Например, UML имеет уровни абстракций уровня пакета / класса / метода, которые позволяют управлять сложностью (скрывая детали на разных уровнях абстракции). Диаграммы позволяют визуализировать эти уровни. Мой опыт до сих пор с FP является слишком тривиальным, чтобы понять, как это необходимо, но любая сложная система будет трудно получить без какой-либо диаграммы. – Fuhrmanator 26 January 2015 в 23:34
  • 4
    Здесь много функциональных диаграмм: felsin9.de/nnis/ghc-vis – Fuhrmanator 19 September 2017 в 13:17

Я думаю, вы могли бы создать класс с именем noclass и включить функции в качестве методов. Кроме того, вы можете разделить noclass на несколько категорий функций.

1
ответ дан Anonymous 20 August 2018 в 14:34
поделиться

Я понимаю, что это старая тема, но я не понимаю эту проблему.

Класс - это просто абстракция понятия, которое связывает функциональность его методов вместе более дружелюбным человеком способом. Например, класс WaveGenerator может включать в себя методы Sine, Sawtooth и SquareWave. Все три метода явно связаны с генератором классов. Однако все трое также не имеют гражданства. Если они разработаны правильно, им не нужно сохранять информацию о состоянии вне метода. Это делает их объектами без гражданства, которые, если я правильно понимаю, делают их неизменяемыми функциями, которые являются основной концепцией в функциональной парадигме.

С концептуальной точки зрения я не вижу никакой разницы между

пусть Envelope Sine = ...

и

позволяет Envelope Generator.Sine = ...

, кроме того, что последний может обеспечить большее понимание цели функции.

0
ответ дан Charley Savage 20 August 2018 в 14:34
поделиться
  • 1
    Объекты - все об инкапсулирующем состоянии. В функциональном программировании, поскольку вы правильно определяете состояние, это не проблема, поскольку все должно быть неизменным. В функциональном программировании гораздо лучше отделять состояние от функции или даже лучше, сводить состояние к функции. Это различие в основной философии, которая является проблемой. В ООП вы программируете скрыть состояние и локализовать изменения в изменяемые объекты, в то время как в FOP вы уменьшаете проблему состояния до неизменяемых структур. – WeNeedAnswers 10 November 2010 в 12:08
  • 2
    Хорошим примером может быть объект человека, с обычным состоянием имени, возраста, адреса и т. Д. В FOP этот тип был бы неизменным, чтобы изменить значение, вы передали бы это в функцию, где он создавал бы новый объект человека , В ООП вы должны использовать средства определения свойств / геттеры, а состояние изменчиво. – WeNeedAnswers 10 November 2010 в 12:13
  • 3
    Возможно, я был неясно, в чем смысл. Оригинальная тема спросила о моделировании стиля функционального программирования. Хотя верно, что ООП спроектирован вокруг императивного стиля программирования, он не ограничивается императивным программированием. Класс, который ограничивается статическими методами, эквивалентен набору инкапсулированных функций. Так же, как C не является языком ООП, он не ограничивается процедурным стилем. – Charley Savage 10 November 2010 в 22:08
  • 4
    Класс, моделируемый с использованием функциональной парадигмы, по-прежнему является программой ООП, но с дополнительными ограничениями на ее дизайн. И, как таковой, он может быть смоделирован в UML, используя те же диаграммы и процедуры, которые используются, например, в графиках состояния OOP минус. Диаграммы классов, активности и последовательности. Случай может быть сделан даже для использования диаграмм компонентов, развертывания и даже совместной работы, адаптированных к функциональному стилю. – Charley Savage 10 November 2010 в 22:21
  • 5
    @WeNeedAnswers - нет, нет. Объекты и, более точно, классы, к которым они принадлежат, предназначены для инкапсуляции поведения и / или состояния (и интерфейсов для представления типов или «ролей»). Без поведения класс - это просто структура. Без состояния (или, точнее, без изменчивого состояния) класс является просто неизменным локусом поведения, совокупностью одного из других типов функций. Итак, no . Они не все об инкапсулирующем состоянии, если только вы не моделируете их для этой цели. – luis.espinal 7 March 2011 в 21:51

Функциональные программисты имеют собственную версию UML, она называется Теория категорий .

(Для этого есть определенная правда, но она предназначена для чтения с помощью юмора ).

5
ответ дан dtw 20 August 2018 в 14:34
поделиться
  • 1
    Я знаю, что вы сделали это с небольшим количеством юмора, но для непосвященных моделирование - это не просто ... моделирование. Речь идет об управлении сложностью (особенно большими его объемами), а также о том, как управлять потенциально большими кодовыми базами до приемлемых уровней. Я уверен, что FP'programmers делают свое собственное крупномасштабное моделирование по-разному; для этого потребуется несколько лет, чтобы он стал формализованным и стандартизованным (с целью управления сложностью, а не формальной корректностью). – luis.espinal 7 March 2011 в 21:54
  • 2
    Это, наверное, самое смешное, что я читал в месяцах. – Darkenor 19 July 2017 в 22:51

UML - это сборник различных типов моделирования. Если вы говорите об объектной диаграмме (диаграмме классов), вы не найдете ничего, что бы соответствовало вашему желаемому использованию. Но если вы говорите о Диаграмме взаимодействия (диаграмме деятельности) или диаграмме требований (используйте диаграмму случая), то, конечно, они помогут вам и станут частью базы UML.

11
ответ дан jpabluz 20 August 2018 в 14:34
поделиться

Чтобы смоделировать функциональную программу, используя диаграмму, а не текстовое представление, вы можете использовать нотацию, подобную той, которая используется для программирования в Viskell или Luna

3
ответ дан Luxspes 20 August 2018 в 14:34
поделиться

UML - это не только диаграммы классов, вы знаете?

Большинство других типов диаграмм (диаграммы использования, диаграммы операций, диаграммы последовательности ...) отлично применимы для чисто функционального стиля программирования , Даже диаграммы классов могут быть полезны, если вы просто не используете атрибуты и ассоциации и интерпретируете «класс» как «набор связанных функций».

12
ответ дан Michael Borgwardt 20 August 2018 в 14:34
поделиться
  • 1
    Тем не менее, я начинаю видеть исходный авторский момент. Если вы просто моделируете коллекцию связанных функций, вы не являетесь «моделированием», а не организацией. Я не согласен с тем, что это все еще полезно , но это не столько поведение моделирования. – Marc Bollinger 16 March 2010 в 22:24
  • 2
    @Marc: диаграммы классов не связаны с модельным поведением; для этого нужны диаграммы активности и последовательности. – Michael Borgwardt 17 March 2010 в 01:28
  • 3
    UML - это все о классах, зачем еще создавать такой бумажный язык? Я сделал много других методов до и использовал методологии, которые завершают языки процедурных типов (SSADM, чтобы назвать их). Еще не видно того, что делает то же самое для функциональных языков. UML - это все сообщения и сотрудничество с дескретными единицами работы, называемыми классами. Но так как функция может быть классом, как можно было бы моделировать что-то без состояния? UML Я чувствую, что один молоток слишком много для чего-то, что является штырем. – WeNeedAnswers 17 March 2010 в 13:41
  • 4
    @WeNeedAnsers: UML не является «бумажным», а также «все о классах». Многие концепции UML не имеют ничего общего с классами. Моделирование чего-либо без состояния так же просто, как воздержание от использования элементов модели, которые составляют состояние. Мне кажется, что в этом вопросе вы искали главным образом для проверки ваших дезинформированных предрассудков. – Michael Borgwardt 17 March 2010 в 13:59
  • 5
    @Michael: Объект без состояния не имеет шаблона поведения и очень сложно моделировать с использованием нотации Object. Пожалуйста, покажите мне пример в UML, и я имею в виду диаграммы сердца и души, где функция может быть смоделирована без искусственно созданного объекта, обертывающего ее. Вопрос в том, как вы моделируете функцию в UML без этих «методов подгонки обуви»? Предрассудков у меня нет, мне нравится UML. Просто ищу способ моделирования функций :) – WeNeedAnswers 20 March 2010 в 02:28

Я на самом деле не пытался моделировать большую систему в UML, а затем перешел на функциональную реализацию, но я не понимаю, почему это не должно работать.

Предполагая, что реализация будет Haskell, я бы начал с определения типов и их отношений с помощью диаграммы классов. Выделите функции класса по их основному аргументу, но имейте в виду, что это всего лишь артефакт UML. Если было проще создать вымышленный одноэлементный объект только для того, чтобы удерживать все функции, это тоже было бы неплохо. Если приложение нуждается в состоянии, тогда у меня не было бы проблем с моделированием, что в диаграмме состояний или диаграмме последовательности. Если бы мне нужна специальная монада для семантики семантики, специфичной для приложения, то это может стать стереотипом; целью было бы описать, что приложение делает в доменах.

Главное, что UML может использоваться для моделирования программы для функциональной реализации. Вы должны иметь в виду сопоставление с реализацией (и это не помешает документировать его), и подгонка далека от точной. Но это может быть сделано, и это может даже повысить ценность.

0
ответ дан Paul Johnson 20 August 2018 в 14:34
поделиться

UML - это объектный подход, потому что на графическом уровне вы не можете определить функциональное моделирование. Трюк заключается в том, чтобы напрямую добавлять ограничения и заметки в модель, а не в уровни диаграмм. Я имею в виду, что вы можете написать полную функциональную документацию по каждому элементу модели непосредственно в метамодели и отобразить только представление объекта с помощью редактора UML. Это, наверное, глупо, но я нашел эту демонстрацию на французском языке точно по одной теме и используя EclipseUML Omondo: OCL и UML 2.2 (демо на французском языке 3mn): http://www.download-omondo.com/regle_ocl .swf

В этом демо объясняется, как добавлять ограничения непосредственно к методам на уровне метамодели. Интересным моментом этой демонстрации является то, что использование единой модели для всего проекта позволяет быть достаточно гибким, чтобы расширить традиционный UML и избежать моделей SysML, BPMN, DSL, поскольку вся информация построена на вершине метамодели UML 2.2. Я не знаю, будет ли это удачей, но эта инициатива очень интересна, потому что уменьшает сложность моделирования и открывает новые границы !!

2
ответ дан UML GURU 20 August 2018 в 14:34
поделиться
  • 1
    Эй, все ответы приветствуются с распростертыми объятиями, единственными глупыми вопросами являются те, о которых не спрашивают. :) Спасибо. Я смотрел на ограничения, думаю, что они прекрасны, но если ваше чувство чистоты говорит, используя такой язык, как Haskell, становится очень неудобно применять то, что не имеет состояния. Ограничения становятся охранниками, но охранники - это нечто большее, чем ограничения. – WeNeedAnswers 17 March 2010 в 13:48
  • 2
    Я не понимаю, почему следующие (практические) аспекты не будут применяться к функциональному программированию: 1. Разделение труда для команд. 2. Дизайн для тестирования. 3. Дизайн для повторного использования. Назовите его классом только с статическими функциями-членами или модулем или же. Помимо уровня функций, организационные уровни более высокого уровня необходимы по практическим соображениям. Системные компоненты в немонолитных приложениях (например, Client, sever) также требуют заявлений о том, что должно быть создано, и сообщаться командам и держателям акций. UML предлагает средства для выражения такой структуры, независимо от языка. – BitTickler 16 January 2016 в 02:41
Другие вопросы по тегам:

Похожие вопросы: