Вход на сайт
редактирование - merge()... в синглетоне
NEW 21.11.12 11:09
Ладышки, возвращаемся к старым баранам...
Когда-то давно Я уже спрашивал, но потом вопрос перестал быть актуальным... Ну а сейчас - снова актуализировался...
Вопросик такой:
В систем есть несколько типов документов.
Нормально документик хранится в файлике и все что надо было делать - прочитать, отпарсить и предоставить доступ к полям.
Потому было сделано простенько - имплементировался синглетон на чтение/парсинг/доступ. Все работает, ошибок почти нет.
Теперь, однако, требуется выполнять редактирование этих документиков.
Пока - простое, в виде слияния двух (требуется ДВА инстанса) однотипных документов, но не исключено что надо будет и что-то большее - вставка текста, обьектов и т.п...
Вот и думаю над тем как лучше с точки зрения архитектуры организовать систему:
- сделать защищенный конструктор в синглетоне и наследовать для редактора
или
- сделать нормальный редактор и уже его ограничить синглетоном там где надо.
Обьем работы - примерно одинаковый, но будут нюансики в имплементации и последующем использовании...
Сижу, думаю...
Когда-то давно Я уже спрашивал, но потом вопрос перестал быть актуальным... Ну а сейчас - снова актуализировался...
Вопросик такой:
В систем есть несколько типов документов.
Нормально документик хранится в файлике и все что надо было делать - прочитать, отпарсить и предоставить доступ к полям.
Потому было сделано простенько - имплементировался синглетон на чтение/парсинг/доступ. Все работает, ошибок почти нет.
Теперь, однако, требуется выполнять редактирование этих документиков.
Пока - простое, в виде слияния двух (требуется ДВА инстанса) однотипных документов, но не исключено что надо будет и что-то большее - вставка текста, обьектов и т.п...
Вот и думаю над тем как лучше с точки зрения архитектуры организовать систему:
- сделать защищенный конструктор в синглетоне и наследовать для редактора
или
- сделать нормальный редактор и уже его ограничить синглетоном там где надо.
Обьем работы - примерно одинаковый, но будут нюансики в имплементации и последующем использовании...
Сижу, думаю...
NEW 21.11.12 22:38
в ответ Murr 21.11.12 11:09
3 раза перечитывал сообщение и три раза не мог понять, о чём оно (:
тоесть у тебя сейчас так:
тоесть у тебя сейчас так:
class Document
{
private Document(){}
public static Instance {get; }
public void Read(Stream from);
public void Parse(string str);
}
ну так сделай так:
class Document
{
private Document(){}
public static Document Read(Stream from);
public static Document Parse(string str);
public static Document Merge(Document doc1, Document doc2);
}
Ты можешь 2 строчки кода, вместо 30 строчек текста привести? :)
NEW 22.11.12 09:31
в ответ Posmotrim 21.11.12 22:38
ну так сделай так:
------
А как оно должно при этом работать? Ты определил статики - т.е. ссылку на обьект надо передавать отдельно...
Ты можешь 2 строчки кода
------
Можно... но часто вырезать две строчки кода - это дольше и гораздо менее продумано...
То, что мне нужно:
- с одной стороны - иметь жесткую гарантию что в системе всего один инстансе обьекта (и фаил читается один раз)
- с другой сторны - что имеется возможность создать другой обьект и выполнить Мерге()...
При этом проблема не столько в имплементации, сколько в том, что сделать надо так, чтобы обезьяна, которая еще толком не освоила операторы, даже при желании не могла написать глупость...
------
А как оно должно при этом работать? Ты определил статики - т.е. ссылку на обьект надо передавать отдельно...
Ты можешь 2 строчки кода
------
Можно... но часто вырезать две строчки кода - это дольше и гораздо менее продумано...
То, что мне нужно:
- с одной стороны - иметь жесткую гарантию что в системе всего один инстансе обьекта (и фаил читается один раз)
- с другой сторны - что имеется возможность создать другой обьект и выполнить Мерге()...
При этом проблема не столько в имплементации, сколько в том, что сделать надо так, чтобы обезьяна, которая еще толком не освоила операторы, даже при желании не могла написать глупость...
NEW 22.11.12 12:27
в ответ Murr 22.11.12 09:31
я бы не стал делать документ синглтоном, а просто бы обеспечил к нему доступ из уже существуюещего синглтона приложения к примеру:
class Application
{
private Application() {throw new NotImplementedException();}
static Application Instance {get {throw new NotImplementedException();}}
public Document ActiveDocument { get; private set; }
public void OpenDocument(Reader from)
{
if(ActiveDocument != null)
ActiveDocument.Close();
ActiveDocument = new Document(from);
}
}
Таким образом, имеем единственный объект документа в приложении(Application).
Теперь рассмотрим класс документа:
class Document
{
public Document(Reader from) { throw new NotImplementedException(); }
//Properties
//...
//Methods
//...
public void Save(Writer to) { throw new NotImplementedException(); }
public void Close() { throw new NotImplementedException(); }
public void MergeWith(Document other){ throw new NotImplementedException(); }
}
NEW 22.11.12 13:29
в ответ Posmotrim 22.11.12 12:27
а просто бы обеспечил к нему доступ из уже существуюещего синглтона
------
А каким образом при этом обеспечить ситуцию при которой обезьяка не сможет испортить исходный документ?
На текущий момент документ просто не имеет Саве()...
По тому подумываю сделать примерно так:
class Document
{
protected Document() {}
private Document(bool inst) {}
public void Load() {}
static Document instance;
public static Document Instance { if(instance == null) instance = Document(true); return instance; }
}
class Document_Editor : Document
{
public Document_Editor : base() {}
public void Save(...) {}
public void Merge(...) {}
}
Что гарантирует защиту он обезьянки, но вводит дополнительный класс...
Либо надо делать что-то совсем заморочное...
------
А каким образом при этом обеспечить ситуцию при которой обезьяка не сможет испортить исходный документ?
На текущий момент документ просто не имеет Саве()...
По тому подумываю сделать примерно так:
class Document
{
protected Document() {}
private Document(bool inst) {}
public void Load() {}
static Document instance;
public static Document Instance { if(instance == null) instance = Document(true); return instance; }
}
class Document_Editor : Document
{
public Document_Editor : base() {}
public void Save(...) {}
public void Merge(...) {}
}
Что гарантирует защиту он обезьянки, но вводит дополнительный класс...
Либо надо делать что-то совсем заморочное...
NEW 22.11.12 13:48
Странная логика - редактор документа наследуется от документа... (:
Ещё раз. Я бы делал так:
Ещё раз. Я бы делал так:
У приложения есть редактор документов - одна штука. (агрегация)
Редактор документов умеет редактировать один документ. (агрегация)
Документ умеет считываться с диска. (операция документа)
Документ умеет записываться на диск. (операция документа)
Ты хочешь сделать следующее:
Приложение должно уметь мёрджить два документа,
но в приложении есть всего один документ.
Далее: если макака может испортить файл документа операцией Save, то почему она не может испортить этот файл используя System.IO.DeleteFile?
NEW 22.11.12 14:09
в ответ Posmotrim 22.11.12 13:48
Далее: если макака может испортить файл документа операцией Save, то почему она не может испортить этот файл используя System.IO.DeleteFile?
-----
Разумеется - сможет. Но за это ей сделают "больно"... так же как и за "Формат С:"
Вопрос ставится только об том. чтобы доступные методы не позволили сделать неправильную операцию.
Ты хочешь сделать следующее:
------
Ну наконец-то - об этом и идет речь с первого поста...
Документ умеет записываться на диск. (операция документа)
------
Не могу разрешить документу быть записываемым или даже редактируемым вне редактора. Вопрос не в том чтобы разрешить это документу, а в том какую архитектуры выбрать чтобы это обеспечить... и чтобы потом не переделывать несколько раз код при изменении требований.
-----
Разумеется - сможет. Но за это ей сделают "больно"... так же как и за "Формат С:"
Вопрос ставится только об том. чтобы доступные методы не позволили сделать неправильную операцию.
Ты хочешь сделать следующее:
------
Ну наконец-то - об этом и идет речь с первого поста...
Документ умеет записываться на диск. (операция документа)
------
Не могу разрешить документу быть записываемым или даже редактируемым вне редактора. Вопрос не в том чтобы разрешить это документу, а в том какую архитектуры выбрать чтобы это обеспечить... и чтобы потом не переделывать несколько раз код при изменении требований.
NEW 22.11.12 14:53
в ответ Murr 22.11.12 14:13
Я так понимаю, что у тебя там несколько разных типом документов...
т.е.
class Document
{
}
class Document_A : Document
{
}
class Document_B : Document
{
}
итд.
может быть тебе тогда сделать мультидокументный синглтон? :)
class Document
{
private static Dictionary <Type, Document> _docs = new Dictionary <Type, Document> ();
private static Document GetDocumentByType (Type type)
{
}
дальше сам :)
}
т.е.
class Document
{
}
class Document_A : Document
{
}
class Document_B : Document
{
}
итд.
может быть тебе тогда сделать мультидокументный синглтон? :)
class Document
{
private static Dictionary <Type, Document> _docs = new Dictionary <Type, Document> ();
private static Document GetDocumentByType (Type type)
{
}
дальше сам :)
}
NEW 22.11.12 15:13
в ответ Программист 22.11.12 14:53
может быть тебе тогда сделать мультидокументный синглтон? :)
-----
Хммм... Не вижу пользы. Потому как документы не заменяемые... т.е. 10 разных документов - 10 разных классов... плюс - редакторы для тех, для которых нужно.
Сделать Фабрику Документов?.. но она не нужна - по задаче, исключая редактирование, остается именно синлетон определенного типа.
-----
Хммм... Не вижу пользы. Потому как документы не заменяемые... т.е. 10 разных документов - 10 разных классов... плюс - редакторы для тех, для которых нужно.
Сделать Фабрику Документов?.. но она не нужна - по задаче, исключая редактирование, остается именно синлетон определенного типа.
NEW 22.11.12 16:05
в ответ Murr 22.11.12 14:09
ну так отдели мух от котлет:
interface IDocument
{
//свойства и методы, которые макаке можно вызывать
}
interface IPersistent
{
void Write(Stream s);
void Read(Stream s);
}
class Application
{
private Application() {throw new NotImplementedException();}
static Application Instance {get {throw new NotImplementedException();}}
public IDocument ActiveDocument { get { return doc; } }
public void OpenDocument(Stream from)
{
doc = new Document(from);
}
private Document doc;
}
class Document : IDocument, IPersistent
{
//...
}
NEW 22.11.12 16:53
Примерно так и думаю...
interface IEditor
{
void Merge(object o);
void Save();
}
interface IEditable
{
IEditor GetEditor();
}
public class Document : IEditable
{
Document() {}
protected Document(IEditable) {}
public void Load();
private static Document instance;
public static Document Instance { ... }
}
internal class DocumentEditor : Document, IEditor
{
protected DocumentEditor() : base(Document.Instance) { }
}
ну так отдели мух от котлет:
------
Ты, видимо, не работал с молодыми индусами... они могут работать с инстансом... но если им сказать, что можно кастить к интерфейсу, то придется каждый день обьяснять почему к одному интерфейсу - можно, а к другому - нельзя...
Индуска... работает 6-й месяц... якобы имеет 3 года опыта с Плюсами... неделю назад ей обясняли, что файл документа (в хмл-формате и уже кешированный в системе) не надо читать через ФилеСтреам... даже если она добавила к нему целую секцию... до уровня того, что после обновления формата файла надо подогнать и ИО в остальном коде ее еще тащить и тащить...
interface IEditor
{
void Merge(object o);
void Save();
}
interface IEditable
{
IEditor GetEditor();
}
public class Document : IEditable
{
Document() {}
protected Document(IEditable) {}
public void Load();
private static Document instance;
public static Document Instance { ... }
}
internal class DocumentEditor : Document, IEditor
{
protected DocumentEditor() : base(Document.Instance) { }
}
ну так отдели мух от котлет:
------
Ты, видимо, не работал с молодыми индусами... они могут работать с инстансом... но если им сказать, что можно кастить к интерфейсу, то придется каждый день обьяснять почему к одному интерфейсу - можно, а к другому - нельзя...
Индуска... работает 6-й месяц... якобы имеет 3 года опыта с Плюсами... неделю назад ей обясняли, что файл документа (в хмл-формате и уже кешированный в системе) не надо читать через ФилеСтреам... даже если она добавила к нему целую секцию... до уровня того, что после обновления формата файла надо подогнать и ИО в остальном коде ее еще тащить и тащить...
NEW 22.11.12 20:57
Для повторного использования реализации в шарпе существует аггрегация.
-----
Агрегация - это хорошо...
Теперь берем документ типа "конфиг" и смотрим на 200-300 свойств конфигурации... а завтра - добавят еще с десяток... и все ето надо поддерживать... а так - агрегация - это хорошо...
Тут очень важно, чтобы свойство Instance имело тип IEditable, а не Document.
------
Должно кастится автоматически... ну если заупрямится - можно и принудительно... Одна точка - не проблема.
-----
Агрегация - это хорошо...
Теперь берем документ типа "конфиг" и смотрим на 200-300 свойств конфигурации... а завтра - добавят еще с десяток... и все ето надо поддерживать... а так - агрегация - это хорошо...
Тут очень важно, чтобы свойство Instance имело тип IEditable, а не Document.
------
Должно кастится автоматически... ну если заупрямится - можно и принудительно... Одна точка - не проблема.
NEW 22.11.12 21:11
в ответ AlexNek 22.11.12 19:29
Но чувствую, что новый бардак 
-----
Ну так у меня другого и не бывает...
Ты можешь индусам только либу выдать?
-----
Если бы... Даже если перенесу все в либу - им все одно будут давать править ее код...
Так что мне надо придумать конструктив, который обеспечит отсутствие глупостей в большинстве случаев. Ну и минимальные усилия по поддержке...
Так что думаю в сторону возможности получить интерфейс редактора он инстанса... но без возможности инстанцировать редактор самостоятельно... как-то так...

-----
Ну так у меня другого и не бывает...

Ты можешь индусам только либу выдать?
-----
Если бы... Даже если перенесу все в либу - им все одно будут давать править ее код...

Так что мне надо придумать конструктив, который обеспечит отсутствие глупостей в большинстве случаев. Ну и минимальные усилия по поддержке...
Так что думаю в сторону возможности получить интерфейс редактора он инстанса... но без возможности инстанцировать редактор самостоятельно... как-то так...
22.11.12 21:24
в ответ Murr 22.11.12 21:11
А как тогда запретить копаться в твоем классе?
Но если прицепить к нему линейку которая будет по рукам бить
То тогда можно спрятать класс как приватный.
У меня еще есть генерик синглетон, хотя у него правда проблема, что от него можно наследоваться, но решается "административными" методами.
Но если прицепить к нему линейку которая будет по рукам бить

То тогда можно спрятать класс как приватный.
У меня еще есть генерик синглетон, хотя у него правда проблема, что от него можно наследоваться, но решается "административными" методами.
22.11.12 22:21
в ответ AlexNek 22.11.12 21:24
решается "административными" методами.
------
В моем случае - без толку...
Вот сегодня.
Срочно! Прямо сейчас!!! Все бросай и занимайся ЭТИМ!!!
Ковыряю... в требованиях (и написанном коде) было учтено, что из шести возможных комбинаций значений будут использоваться только четыре... в измененном коде - задействован пятый вариант... при етом задействован, по традиции, без проверки "а как оно будет работать?" ну и где-то бог знает где не сгенерился какой-то див и панель "уехала"... Кода при этом добавили строк 100-150 - как оно должно быть уже и непоймешь... даже при том, что Я потратил более двух недель на очистку и делание понйтхым этого кода...
Починка. Написал "по месту" проверку всех 6 комбинаций, добавил индикацию "вне всех условий" и... поправил _только_ пятую. С остальным пусть кто-нибудь разбирается...
По твоей ситуации - попробуй static readonly для хранения...
------
В моем случае - без толку...
Вот сегодня.
Срочно! Прямо сейчас!!! Все бросай и занимайся ЭТИМ!!!
Ковыряю... в требованиях (и написанном коде) было учтено, что из шести возможных комбинаций значений будут использоваться только четыре... в измененном коде - задействован пятый вариант... при етом задействован, по традиции, без проверки "а как оно будет работать?" ну и где-то бог знает где не сгенерился какой-то див и панель "уехала"... Кода при этом добавили строк 100-150 - как оно должно быть уже и непоймешь... даже при том, что Я потратил более двух недель на очистку и делание понйтхым этого кода...
Починка. Написал "по месту" проверку всех 6 комбинаций, добавил индикацию "вне всех условий" и... поправил _только_ пятую. С остальным пусть кто-нибудь разбирается...
По твоей ситуации - попробуй static readonly для хранения...
NEW 22.11.12 22:25
Что то пока не вижу в форуме этого ответа..
А откуда ты это взял, что будет все время истина?
Не поленился, запустил - работает именно как ожидалось
Правда конструктор, компайлер все же исправил
в ответ Murr 22.11.12 21:11
В ответ на:
bool q = (c1 == c2); - always TRUE...
bool q = (c1 == c2); - always TRUE...
Что то пока не вижу в форуме этого ответа..
А откуда ты это взял, что будет все время истина?
Не поленился, запустил - работает именно как ожидалось
Правда конструктор, компайлер все же исправил
В ответ на:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{
.maxstack 8
L_0000: ldstr "value"
L_0005: stsfld string Test.A::a
L_000a: nop
L_000b: nop
L_000c: ret
}
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{
.maxstack 8
L_0000: ldstr "value"
L_0005: stsfld string Test.A::a
L_000a: nop
L_000b: nop
L_000c: ret
}
NEW 22.11.12 22:41
в ответ Murr 22.11.12 20:57
В ответ на:
Агрегация - это хорошо...
Теперь берем документ типа "конфиг" и смотрим на 200-300 свойств конфигурации... а завтра - добавят еще с десяток... и все ето надо поддерживать... а так - агрегация - это хорошо...
Агрегация - это хорошо...
Теперь берем документ типа "конфиг" и смотрим на 200-300 свойств конфигурации... а завтра - добавят еще с десяток... и все ето надо поддерживать... а так - агрегация - это хорошо...
interface IDocument
{
//200-300 свойств
//...
}
interface IDocEditor
{
IDocument Document {get; }
}
какая разница классу, реализующему IDocEditor, сколько полей в IDocument?