Как способ удаления недопустимых символов 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;
}
}
Обновление: Следует отметить, что операция кодирования создает строку с длиной, которая больше или равна длине строки источника. Это может быть важно, если вы храните закодированную строку в базе данных в столбце строки с ограничением по длине и проверяете длину строки источника в приложении для соответствия ограничениям столбца данных.
Функциональные программисты, как правило, не очень полезны для диаграмм. Многие функциональные программисты (но не все) обнаруживают, что запись типов - хороший способ инкапсулировать конструктивные отношения, которые программисты OO помещают в диаграммы UML.
Поскольку изменчивое состояние встречается редко в функциональных программ нет «изменяемых» объектов, поэтому обычно не полезно и не нужно связывать диаграммы между ними. И хотя одна функция может вызвать другую, это свойство обычно не важно для общего дизайна системы, а только для реализации функции, выполняющей вызов.
Если бы я чувствовал сильную потребность в диаграмме a я мог бы использовать концептуальную карту , в которой типы или функции играют роль понятий.
Я думаю, вы могли бы создать класс с именем noclass
и включить функции в качестве методов. Кроме того, вы можете разделить noclass
на несколько категорий функций.
Я понимаю, что это старая тема, но я не понимаю эту проблему.
Класс - это просто абстракция понятия, которое связывает функциональность его методов вместе более дружелюбным человеком способом. Например, класс WaveGenerator может включать в себя методы Sine, Sawtooth и SquareWave. Все три метода явно связаны с генератором классов. Однако все трое также не имеют гражданства. Если они разработаны правильно, им не нужно сохранять информацию о состоянии вне метода. Это делает их объектами без гражданства, которые, если я правильно понимаю, делают их неизменяемыми функциями, которые являются основной концепцией в функциональной парадигме.
С концептуальной точки зрения я не вижу никакой разницы между
пусть Envelope Sine = ...
и
позволяет Envelope Generator.Sine = ...
, кроме того, что последний может обеспечить большее понимание цели функции.
Функциональные программисты имеют собственную версию UML, она называется Теория категорий .
(Для этого есть определенная правда, но она предназначена для чтения с помощью юмора ).
UML - это сборник различных типов моделирования. Если вы говорите об объектной диаграмме (диаграмме классов), вы не найдете ничего, что бы соответствовало вашему желаемому использованию. Но если вы говорите о Диаграмме взаимодействия (диаграмме деятельности) или диаграмме требований (используйте диаграмму случая), то, конечно, они помогут вам и станут частью базы UML.
Чтобы смоделировать функциональную программу, используя диаграмму, а не текстовое представление, вы можете использовать нотацию, подобную той, которая используется для программирования в Viskell или Luna
UML - это не только диаграммы классов, вы знаете?
Большинство других типов диаграмм (диаграммы использования, диаграммы операций, диаграммы последовательности ...) отлично применимы для чисто функционального стиля программирования , Даже диаграммы классов могут быть полезны, если вы просто не используете атрибуты и ассоциации и интерпретируете «класс» как «набор связанных функций».
Я на самом деле не пытался моделировать большую систему в UML, а затем перешел на функциональную реализацию, но я не понимаю, почему это не должно работать.
Предполагая, что реализация будет Haskell, я бы начал с определения типов и их отношений с помощью диаграммы классов. Выделите функции класса по их основному аргументу, но имейте в виду, что это всего лишь артефакт UML. Если было проще создать вымышленный одноэлементный объект только для того, чтобы удерживать все функции, это тоже было бы неплохо. Если приложение нуждается в состоянии, тогда у меня не было бы проблем с моделированием, что в диаграмме состояний или диаграмме последовательности. Если бы мне нужна специальная монада для семантики семантики, специфичной для приложения, то это может стать стереотипом; целью было бы описать, что приложение делает в доменах.
Главное, что UML может использоваться для моделирования программы для функциональной реализации. Вы должны иметь в виду сопоставление с реализацией (и это не помешает документировать его), и подгонка далека от точной. Но это может быть сделано, и это может даже повысить ценность.
UML - это объектный подход, потому что на графическом уровне вы не можете определить функциональное моделирование. Трюк заключается в том, чтобы напрямую добавлять ограничения и заметки в модель, а не в уровни диаграмм. Я имею в виду, что вы можете написать полную функциональную документацию по каждому элементу модели непосредственно в метамодели и отобразить только представление объекта с помощью редактора UML. Это, наверное, глупо, но я нашел эту демонстрацию на французском языке точно по одной теме и используя EclipseUML Omondo: OCL и UML 2.2 (демо на французском языке 3mn): http://www.download-omondo.com/regle_ocl .swf
В этом демо объясняется, как добавлять ограничения непосредственно к методам на уровне метамодели. Интересным моментом этой демонстрации является то, что использование единой модели для всего проекта позволяет быть достаточно гибким, чтобы расширить традиционный UML и избежать моделей SysML, BPMN, DSL, поскольку вся информация построена на вершине метамодели UML 2.2. Я не знаю, будет ли это удачей, но эта инициатива очень интересна, потому что уменьшает сложность моделирования и открывает новые границы !!