Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

редактирование - merge()... в синглетоне

408  1 2 3 все
Murr патриот21.11.12 11:09
Murr
NEW 21.11.12 11:09 
Ладышки, возвращаемся к старым баранам...
Когда-то давно Я уже спрашивал, но потом вопрос перестал быть актуальным... Ну а сейчас - снова актуализировался...
Вопросик такой:
В систем есть несколько типов документов.
Нормально документик хранится в файлике и все что надо было делать - прочитать, отпарсить и предоставить доступ к полям.
Потому было сделано простенько - имплементировался синглетон на чтение/парсинг/доступ. Все работает, ошибок почти нет.
Теперь, однако, требуется выполнять редактирование этих документиков.
Пока - простое, в виде слияния двух (требуется ДВА инстанса) однотипных документов, но не исключено что надо будет и что-то большее - вставка текста, обьектов и т.п...
Вот и думаю над тем как лучше с точки зрения архитектуры организовать систему:
- сделать защищенный конструктор в синглетоне и наследовать для редактора
или
- сделать нормальный редактор и уже его ограничить синглетоном там где надо.
Обьем работы - примерно одинаковый, но будут нюансики в имплементации и последующем использовании...
Сижу, думаю...
#1 
  Posmotrim посетитель21.11.12 22:38
Posmotrim
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 строчек текста привести? :)

#2 
Murr патриот22.11.12 09:31
Murr
NEW 22.11.12 09:31 
в ответ Posmotrim 21.11.12 22:38
ну так сделай так:
------
А как оно должно при этом работать? Ты определил статики - т.е. ссылку на обьект надо передавать отдельно...
Ты можешь 2 строчки кода
------
Можно... но часто вырезать две строчки кода - это дольше и гораздо менее продумано...
То, что мне нужно:
- с одной стороны - иметь жесткую гарантию что в системе всего один инстансе обьекта (и фаил читается один раз)
- с другой сторны - что имеется возможность создать другой обьект и выполнить Мерге()...
При этом проблема не столько в имплементации, сколько в том, что сделать надо так, чтобы обезьяна, которая еще толком не освоила операторы, даже при желании не могла написать глупость...
#3 
  Posmotrim посетитель22.11.12 12:27
Posmotrim
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(); }
}


#4 
Murr патриот22.11.12 13:29
Murr
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(...) {}
}
Что гарантирует защиту он обезьянки, но вводит дополнительный класс...
Либо надо делать что-то совсем заморочное...
#5 
  Posmotrim посетитель22.11.12 13:48
Posmotrim
NEW 22.11.12 13:48 
в ответ Murr 22.11.12 13:29, Последний раз изменено 22.11.12 14:00 (Posmotrim)
Странная логика - редактор документа наследуется от документа... (:
Ещё раз. Я бы делал так:
  У приложения есть редактор документов - одна штука. (агрегация)
Редактор документов умеет редактировать один документ. (агрегация)
Документ умеет считываться с диска. (операция документа)
Документ умеет записываться на диск. (операция документа)

Ты хочешь сделать следующее:

 Приложение должно уметь мёрджить два документа,
но в приложении есть всего один документ.


Далее: если макака может испортить файл документа операцией Save, то почему она не может испортить этот файл используя System.IO.DeleteFile?

#6 
Murr патриот22.11.12 14:09
Murr
NEW 22.11.12 14:09 
в ответ Posmotrim 22.11.12 13:48
Далее: если макака может испортить файл документа операцией Save, то почему она не может испортить этот файл используя System.IO.DeleteFile?
-----
Разумеется - сможет. Но за это ей сделают "больно"... так же как и за "Формат С:"
Вопрос ставится только об том. чтобы доступные методы не позволили сделать неправильную операцию.
Ты хочешь сделать следующее:
------
Ну наконец-то - об этом и идет речь с первого поста...
Документ умеет записываться на диск. (операция документа)
------
Не могу разрешить документу быть записываемым или даже редактируемым вне редактора. Вопрос не в том чтобы разрешить это документу, а в том какую архитектуры выбрать чтобы это обеспечить... и чтобы потом не переделывать несколько раз код при изменении требований.
#7 
Murr патриот22.11.12 14:13
Murr
NEW 22.11.12 14:13 
в ответ Posmotrim 22.11.12 12:27
а просто бы обеспечил к нему доступ из уже существуюещего синглтона
------
У меня есть где-то с сотню таких синглетонов... никак руки не доходят избавиться...
#8 
Программист местный житель22.11.12 14:53
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)
{
}
дальше сам :)
}
#9 
Murr патриот22.11.12 15:13
Murr
NEW 22.11.12 15:13 
в ответ Программист 22.11.12 14:53
может быть тебе тогда сделать мультидокументный синглтон? :)
-----
Хммм... Не вижу пользы. Потому как документы не заменяемые... т.е. 10 разных документов - 10 разных классов... плюс - редакторы для тех, для которых нужно.
Сделать Фабрику Документов?.. но она не нужна - по задаче, исключая редактирование, остается именно синлетон определенного типа.
#10 
  Posmotrim посетитель22.11.12 16:05
Posmotrim
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
{
//...
}


#11 
Murr патриот22.11.12 16:53
Murr
NEW 22.11.12 16:53 
в ответ Posmotrim 22.11.12 16:05, Последний раз изменено 22.11.12 16:55 (Murr)
Примерно так и думаю...
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 года опыта с Плюсами... неделю назад ей обясняли, что файл документа (в хмл-формате и уже кешированный в системе) не надо читать через ФилеСтреам... даже если она добавила к нему целую секцию... до уровня того, что после обновления формата файла надо подогнать и ИО в остальном коде ее еще тащить и тащить...
#12 
  Posmotrim посетитель22.11.12 17:10
Posmotrim
NEW 22.11.12 17:10 
в ответ Murr 22.11.12 16:53
Тут очень важно, чтобы свойство Instance имело тип IEditable, а не Document.
И не наследуй DocumentEditor от Document! Пожалуйста :) ! Для повторного использования реализации в шарпе существует аггрегация. Тут как в C++ нет приватного наследования.
#13 
AlexNek патриот22.11.12 19:29
AlexNek
NEW 22.11.12 19:29 
в ответ Murr 22.11.12 16:53
Что то не совсем догоняюю, что ты хочешь сделать. Но чувствую, что новый бардак
Ты можешь индусам только либу выдать?
Если да, то выдавай им наружу только интерфейсы через сервис.
Работы побольше, но криво пользовать будет весьма затруднительно.
#14 
Murr патриот22.11.12 20:57
Murr
NEW 22.11.12 20:57 
в ответ Posmotrim 22.11.12 17:10, Последний раз изменено 22.11.12 20:58 (Murr)
Для повторного использования реализации в шарпе существует аггрегация.
-----
Агрегация - это хорошо...
Теперь берем документ типа "конфиг" и смотрим на 200-300 свойств конфигурации... а завтра - добавят еще с десяток... и все ето надо поддерживать... а так - агрегация - это хорошо...
Тут очень важно, чтобы свойство Instance имело тип IEditable, а не Document.
------
Должно кастится автоматически... ну если заупрямится - можно и принудительно... Одна точка - не проблема.
#15 
Murr патриот22.11.12 21:11
Murr
NEW 22.11.12 21:11 
в ответ AlexNek 22.11.12 19:29
Но чувствую, что новый бардак
-----
Ну так у меня другого и не бывает...
Ты можешь индусам только либу выдать?
-----
Если бы... Даже если перенесу все в либу - им все одно будут давать править ее код...
Так что мне надо придумать конструктив, который обеспечит отсутствие глупостей в большинстве случаев. Ну и минимальные усилия по поддержке...
Так что думаю в сторону возможности получить интерфейс редактора он инстанса... но без возможности инстанцировать редактор самостоятельно... как-то так...
#16 
AlexNek патриот22.11.12 21:24
AlexNek
NEW 22.11.12 21:24 
в ответ Murr 22.11.12 21:11
А как тогда запретить копаться в твоем классе?
Но если прицепить к нему линейку которая будет по рукам бить
То тогда можно спрятать класс как приватный.
У меня еще есть генерик синглетон, хотя у него правда проблема, что от него можно наследоваться, но решается "административными" методами.
#17 
Murr патриот22.11.12 22:21
Murr
22.11.12 22:21 
в ответ AlexNek 22.11.12 21:24
решается "административными" методами.
------
В моем случае - без толку...
Вот сегодня.
Срочно! Прямо сейчас!!! Все бросай и занимайся ЭТИМ!!!
Ковыряю... в требованиях (и написанном коде) было учтено, что из шести возможных комбинаций значений будут использоваться только четыре... в измененном коде - задействован пятый вариант... при етом задействован, по традиции, без проверки "а как оно будет работать?" ну и где-то бог знает где не сгенерился какой-то див и панель "уехала"... Кода при этом добавили строк 100-150 - как оно должно быть уже и непоймешь... даже при том, что Я потратил более двух недель на очистку и делание понйтхым этого кода...
Починка. Написал "по месту" проверку всех 6 комбинаций, добавил индикацию "вне всех условий" и... поправил _только_ пятую. С остальным пусть кто-нибудь разбирается...
По твоей ситуации - попробуй static readonly для хранения...
#18 
AlexNek патриот22.11.12 22:25
AlexNek
NEW 22.11.12 22:25 
в ответ Murr 22.11.12 21:11
В ответ на:
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
}

#19 
  Posmotrim посетитель22.11.12 22:41
Posmotrim
NEW 22.11.12 22:41 
в ответ Murr 22.11.12 20:57
В ответ на:
Агрегация - это хорошо...
Теперь берем документ типа "конфиг" и смотрим на 200-300 свойств конфигурации... а завтра - добавят еще с десяток... и все ето надо поддерживать... а так - агрегация - это хорошо...

interface IDocument 
{
//200-300 свойств
//...
}
interface IDocEditor
{
IDocument Document {get; }
}


какая разница классу, реализующему IDocEditor, сколько полей в IDocument?

#20 
1 2 3 все