[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Объекты справочники
a.dobrynin
Всем доброго времени суток.
Есть такая задача:
в системе заводится некая фирма (ООО "А"), фирме присваивают некие контакты (+7-123-456-7890, info@a.ru, test@a.ru), каждый контакт имеет свой тип (контактный телефон, e-mail, jabber)

class Firm {
protected $_contact = array();
protected $_name = '';
public function setContact ($contact) {
$this->_contact[] = $contact;
return $this;
}
}


class Contact {
protected $_type = null;
protected $_value = '';
public function setType ($type) {
$this->_type = $type;
return $this;
}
}


class ContactType {
protected $_contact = array();
protected $_name = '';
public function setContact ($contact) {
$this->_contact[] = $contact;
return $this;
}
}

  • каждая фирма содержит набор контактов
  • каждый контакт принадлежит только одному типу
  • каждый тип контактов содержит набор контактов

  • при создании фирмы создаются контакты
  • при создании контакта создаётся/берётся имеющийся тип

получаем некий граф, где у контакта есть два родителя, контакт создаётся через фирму, а тип необходимо подключить каким-то хитрым образом, причём тип не зависит от контакта

Уважаемые, Гуру, помогите найти решение прокси класса, который при создании типа либо подставлял имеющийся тип, либо создавал новый
P.S. в течении работы над типом тоже могут производиться операции, которые
должны приводить к изменениям у всех зависимых контактов (например email поменяли на МЫЛО)
необходимое и важное условие - конструктор не принимает параметров.



Спустя 39 минут, 4 секунды (17.01.2011 - 12:53) a.dobrynin написал(а):
некоторые соображения по теме:
создать прокси класс, который будет содержать ссылки на все созданные эл-ты и проверять уникальность нового объекта.

class Proxy {
protected static $_array = array();
// Installation - интерфейс
public static function set($type, Installation $item) {
// если нет ещё ни одного эл-та, то нужно создать и вернуть ссылку на этот эл-т
if (!isset(self::$_array[$type])) {
self::$_array[$type] = array($item);
return $item;
} else {
// пытаемся найти равный в уже имеющемся списке
foreach (self::$_array[$type] as $my_item) {
if ($item->equal($my_item)) {
return $my_item;
}
}

// если не нашли то заносим в список
self::$_array[$type][] = $item;
return $item;
}
}


public static function get($type) {
if (isset(self::$_array['type'])) {
return self::$_array['type'];
} else {
return array();
}
}


public static function test() {
// проверяем каждый тип
foreach (self::$_array as $type) {
// и сравниваем все эл-ты между собой
foreach ($type as $key1 => $item1) {
foreach ($type as $key2 => $item2) {
if ($key1 < $key2 && $item1->equal($item2)) {
// при равенстве любых из них удаляем последний
unset(self::$_array[$key2]);
}
}
}
}
}
}


проблемы:
  • при проверке двух новорождённых объектов класс скажет что они равны и даст ссылку на один и тот же объект то, хотя из них мы потом будем ПЫТАТЬСЯ создать разные объекты.
  • при создании нового пустого эл-та, он при сравнении с остальными эл-тами не даст результата и внесётся как уникальный, а потом может стать равным какому-либо
  • при тестировании массива нужно как-то корректнее удалять эл-ты, что бы все ссылающиеся на эти объекты переменные переопределились на новую ссылку
может кто-то подскажет как решить хотя бы одну из вставших пере до мной проблем?

Спустя 19 часов, 39 минут, 47 секунд (18.01.2011 - 08:33) a.dobrynin написал(а):
$and = "и";
$can = "может";
$who = "кто";
$not1 = "не";
$how = "что";
$not2 = "ни";
$help = "помочь";

echo "{$and} {$how}, {$not2} {$who} {$not1} {$can} {$help}?"

Спустя 17 минут, 57 секунд (18.01.2011 - 08:51) kirik написал(а):
Цитата (a.dobrynin @ 18.01.2011 - 00:33)
$and = "и";
$can = "может";
$who = "кто";
$not1 = "не";
$how = "что";
$not2 = "ни";
$help = "помочь";

echo "{$and} {$how}, {$not2} {$who} {$not1} {$can} {$help}?"

Там в конце нужно точку с запятой поставить.. иначе ошибку выдает..


Цитата (a.dobrynin @ 17.01.2011 - 04:14)
получаем некий граф, где у контакта есть два родителя

Почему два? Родитель получается один - фирма, а тип это просто такое же свойство как и email например..

Толком не понял что именно требуется (саму задачу), но предположительно как вы и сделали - нужен массив, который будет это всё дело хранить.

Спустя 53 минуты, 30 секунд (18.01.2011 - 09:44) a.dobrynin написал(а):
смысл такой:
1. фирме принадлежит набор контактов
2. типу контакта принадлежит другой набор контактов (может больше чем у фирмы, а может и меньше)
3. фирма порождает набор контактов
4. каждый контакт порождает дополнительного родителя - тип контакта

весь затык в том, что породить родителя с набором себе-подобных вызывает логическую трудность, а в моём случае взрыв мозга.

Спустя 5 часов, 52 минуты, 35 секунд (18.01.2011 - 15:37) Dron19 написал(а):
Цитата (a.dobrynin @ 17.01.2011 - 09:53)
некоторые соображения по теме:
создать прокси класс, который будет содержать ссылки на все созданные эл-ты и проверять уникальность нового объекта.

class Proxy {
protected static $_array = array();
// Installation - интерфейс
public static function set($type, Installation $item) {
// если нет ещё ни одного эл-та, то нужно создать и вернуть ссылку на этот эл-т
if (!isset(self::$_array[$type])) {
self::$_array[$type] = array($item);
return $item;
} else {
// пытаемся найти равный в уже имеющемся списке
foreach (self::$_array[$type] as $my_item) {
if ($item->equal($my_item)) {
return $my_item;
}
}

// если не нашли то заносим в список
self::$_array[$type][] = $item;
return $item;
}
}


public static function get($type) {
if (isset(self::$_array['type'])) {
return self::$_array['type'];
} else {
return array();
}
}


public static function test() {
// проверяем каждый тип
foreach (self::$_array as $type) {
// и сравниваем все эл-ты между собой
foreach ($type as $key1 => $item1) {
foreach ($type as $key2 => $item2) {
if ($key1 < $key2 && $item1->equal($item2)) {
// при равенстве любых из них удаляем последний
unset(self::$_array[$key2]);
}
}
}
}
}
}


проблемы:
  • при проверке двух новорождённых объектов класс скажет что они равны и даст ссылку на один и тот же объект то, хотя из них мы потом будем ПЫТАТЬСЯ создать разные объекты.
  • при создании нового пустого эл-та, он при сравнении с остальными эл-тами не даст результата и внесётся как уникальный, а потом может стать равным какому-либо
  • при тестировании массива нужно как-то корректнее удалять эл-ты, что бы все ссылающиеся на эти объекты переменные переопределились на новую ссылку
может кто-то подскажет как решить хотя бы одну из вставших пере до мной проблем?

Так часто не используйте foreach т.к он намного медленнее for и while, с помощью них вполне можно решить задачу и без foreach

Спустя 51 секунда (18.01.2011 - 15:38) Dron19 написал(а):
Это был чисто совет по программированию, желательно учтите это

Спустя 1 час, 28 минут, 7 секунд (18.01.2011 - 17:06) linker написал(а):
Dron19
В случае ассоциативного массива нет ничего кроме foreach(){}.

Спустя 12 часов, 51 минута, 2 секунды (19.01.2011 - 05:57) a.dobrynin написал(а):
когда только начинал свою девелоперскую карьеру, тоже пользовался только for и while, а потом пришло великое осознание удобства исспользования ассоциативного массива.

полностью согласен с linker
+
при нынешних ресурсах серверов стоит больше беспокоиться не за foreach, а за оптимизацию SQL запросов

Спустя 5 часов, 36 минут, 18 секунд (19.01.2011 - 11:33) a.dobrynin написал(а):
Думаю тему можно закрыть, ответов и даже предположений не видно sad.gif

Спустя 33 минуты, 17 секунд (19.01.2011 - 12:06) linker написал(а):
a.dobrynin
Да есть у меня предложения, но пока нет времени развернуто тебе ответить.

Спустя 1 час, 6 минут, 7 секунд (19.01.2011 - 13:12) a.dobrynin написал(а):
linker
жду с нетерпением.
Пожалуйста, найдите время

Спустя 5 дней, 4 часа, 16 минут, 20 секунд (24.01.2011 - 17:29) linker написал(а):
Собственно класс типов контактов и будет выступать в роли прокси-класса. Смотри, фирма не зависит ни от контактов ни от типов. Тип контакта не зависит ни от фирмы, ни от ее контактов. Контакт не зависит от фирмы, но зависит от типа контакта. Значит контакт должен порождать его тип.
Как бы ты не обзывал контакты: e-mail, мыло, icq, аська и пр. так или иначе тип должен иметь уникальный идентификатор, по которому его можно было бы определять.
При создании контакта, фирма должна говорить классу типов контактов, что "я хочу добавить/изменить/удалить контакт, который соответствует твоему конкретному типу (по идентификатору)".

Спустя 1 день, 12 часов, 53 минуты, 40 секунд (26.01.2011 - 06:22) Guest написал(а):
Спасибо, я примерно так и сделал.

Фирма порождает контакты через прокси класс (хотя мне это не очень нравится)
контакт порождаемый фирмой получает ссылку на родителя, после чего он знает ID и имя родителя при сохранении

Контакт порождает свой тип через прокси класс, который даже и не знает кто его породил т.к. ему этого и не надо.

сохранение идёт сл. образом:
1. сигнал приходит к фирме.
2. она сохраняется и передаёт сигнал своим контактам
3. контакты передают сигнал своему типу и ждут ответа
4. контакты сохраняются исходя из данных ссылок которые в нём хранятся (фирма, тип)

Это лучшее решение на сегодняшний день, правда в идеале хотелось бы чтобы фирма не знала о том, что у неё есть контакты, но это за пределами моего мозга, а сейчас и за пределами времени для реализации проекта =)

linker спасибо.

Спустя 2 часа, 42 минуты, 48 секунд (26.01.2011 - 09:05) Dron19 написал(а):
Цитата (linker @ 18.01.2011 - 14:06)
Dron19
В случае ассоциативного массива нет ничего кроме foreach(){}.

Да, правильно, я всего лишь даю совет поменьше его использовать.

Спустя 15 минут, 16 секунд (26.01.2011 - 09:20) Dron19 написал(а):
Цитата (a.dobrynin @ 19.01.2011 - 02:57)
когда только начинал свою девелоперскую карьеру, тоже пользовался только for и while, а потом пришло великое осознание удобства исспользования ассоциативного массива.

полностью согласен с linker
+
при нынешних ресурсах серверов стоит больше беспокоиться не за foreach, а за оптимизацию SQL запросов

Нет, если ты не замерял время выполнения этого цикла, не надо что-то утверждать, говорю же, его нужно использовать по минимуму. А от sql инъекцию предотвратить не сложно, так же не нужно забывать про php including дыры.

Спустя 4 минуты, 16 секунд (26.01.2011 - 09:25) linker написал(а):
Нет, есть конечно методы пройтись по ассоциативному массиву без foreach() но они еще медленнее чем foreach().

Спустя 3 минуты, 38 секунд (26.01.2011 - 09:28) Dron19 написал(а):
Да, но все же я же это говорю не для того чтобы по умничать, в для того что бы помочь чем-то

Спустя 9 минут, 58 секунд (26.01.2011 - 09:38) linker написал(а):
Dron19
Да понятно оно.


_____________
Perl — это тот язык, который одинаково выглядит как до, так и после RSA шифрования…
— Keith Bostic
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.