Добавление типа файлов в eclipse

Собрался ворох записей в черновиках. Начну понемногу полировать и публиковать, чтобы зря не пылились =)


Добавить своё расширение для определённого типа файлов можно следующим образом:

1. Идём в настройки

eclipse-window-preferences

2. Добавляем расширение для необходимого типа:

content-types

3. Устанавливаем чем открывать новый тип файла:

file-associations

Рубрика: Основное | Метки: , | Оставить комментарий

Публикация данных яндекс.метрики

Хотел было опубликовать здесь данные по статистике для этого блога: samizdam.net, но, увы не нашёл в настройках Яндекс.Метрики способа это сделать.

Ладно, добавил информер в футер.

Яндекс.Метрика

Вот, включил старый интерфейс, и быстро нашёл:

yandex.metrika-old-interface-helpful-for-enable-public-access-to-statistics

Теперь, Вы можете видеть статистику посещений этого блога, дорогие читатели =)

Djn

Рубрика: Русский сео | Метки: , , , , , , , | Оставить комментарий

Что за рейтинг показывает гугл?

Сегодня обратил внимание, что в поисковой выдаче Google, в снипетте первого сайта, между заголовком-ссылкой и описанием, стоят пять звёздочек и надпись:

Рейтинг: 4,4 — ?8 голосов

Кстати, вот скриншот:

google-rait

А раньше или не обращал внимание, или не задавался вопросом, как рассчитывается этот рейтинг?

Самое забавное в этой истории: гугление на этот вопрос не дало ответа! Скрин:

google-rait-query

source: https://www.google.ru/search?q=%D1%87%D1%82%D0%BE+%D0%B7%D0%B0+%D1%80%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3+%D0%BF%D0%BE%D0%BA%D0%B0%D0%B7%D1%8B%D0%B2%D0%B5%D1%82+%D0%B3%D1%83%D0%B3%D0%BB&ie=utf-8&oe=utf-8&gws_rd=cr&ei=oeJMVtzYIIKtswHG14-ICQ

Рубрика: Побочное, Эксперименты | Метки: , , , | Оставить комментарий

Недоступность сайта ataman-za-veru.spb.ru

Разбирая почту увидел два письма от Яндекс.Метрики. С интервалом в два с половиной часа. Первое о недоступности сайта, второе о доступности.

ataman-za-veru.spb.ru-Yandex.Metrika

Кстати, у сайта совершенно новый дизайн, и он переехал с моих велосипедов образца 200X года на Joomla! Но это уже не моя забота.

Whois:
https://www.nic.ru/whois/?query=http%3A%2F%2Fataman-za-veru.spb.ru%2F

PS: и попутно узнал, что Fireshot баговано снимает на e.mail.ru.

Рубрика: Основное | Оставить комментарий

Proxy — пример использования в сервисном слое

Этим постом хочу открыть цикл заметок, который может быть полезен разработчикам, как начинающим, так и среднего уровня, желающим лучше разобраться в шаблонах проектирования и объектно-ориентированном дизайне программного обеспечения. В своё время я страдал от недостатка недостатка доступной русскоязычной литературы по теме, и двух крайностей в имеющихся публикациях: либо это сугубо академические, унылые диаграммы из которых не ясно когда и зачем данный шаблон применим, либо взятые с потолка, и не совместимые с жизнью примеры. Есть, конечно, «банда четырёх» и М.Фаулер (последнему отдельное огромное спасибо, как В.Кулакову, но реальных примеров, на мой взгляд, им недостаёт.

Если проще, то я покажу на конкретных примерах какие паттерны существуют, как их можно использовать, что это даёт и зачем нужно. Все примеры кода будут браться из «домашнего» проекта, которым я занимаюсь на досуге: phamily framework — это PHP фреймворк, для работы с родственными связями между людьми, именами, родословными и прочей генеалогией.

При написании фреймворка я использовал TDD-методологию, и, во многом благодаря ей, удалось добиться хорошего API, продуманной структуры классов и стабильности кода.

Итак, Proxy — Заместитель

Хватить болтать, пора глянуть код!

Сервис, отвечающий за работу с персонами — главным доменным объектом нашего приложения.

repository = new PersonaRepositoryProxy();
	}
	/*
	 * здесь происходит установка реального репозитория для заместителя
	 * в этот момент он становится активен
	 */
	public function useRepository(PersonaRepositoryInterface $repository){
		$this->repository->setRepository($repository);
	}
	
	/*
	 * этот метод даёт возможность в клиентском коде убедится
	 * был ли подключен репозиторий, то есть будут ли данные сохранены сервисом
	 */
	public function isRepositoryUsed(){
		return $this->repository->isActive();
	}
	
	/*
	 * создание новой персоны, которая будет при возможности сохранена в хранилище
	 */
	public function create(
			$gender = self::GENDER_UNDEFINED,
			array $names = [], 
			PersonaInterface $father = null,
			PersonaInterface $mother = null,			
			DateTimeInterface $dateOfBirth = null, 
			DateTimeInterface $dateOfDeath = null 
	){
		$persona = new Persona($gender, $names);
		
		$this->repository->save($persona);
		
		return $persona;
	}
	
	/*
	 * удаление персоны из памяти и
	 */
	public function delete(PersonaInterface &$persona){
		$this->repository->delete($persona);
		
		/*
		 * destroy object
		 */
		$persona = null;
	}
}

Ссылки на исходник в bitbucket.

Код сервиса приведён целиком, т.к. он ещё не очень большой, а каждый метод иллюстрирует использование репозитория. Репозиторий предоставляет интерфейс для записи, чтения и удаления доменного объекта из хранилища данных. Кстати вот он:


Ссылка на исходник в bitbucket.

А вот и сам наш Заместитель, заметьте он реализует тот же интерфейс:

setRepository($repository);
		}
	}

	/*
	 * возможность установить реальный репозиторий, который будет использован. 
	 * происходит активация Заместителя. 
	 */
	public function setRepository(PersonaRepositoryInterface $repository){
		$this->repository = $repository;
		$this->active = true;
	}

	/*
	 * а это способ проверить, есть ли реальный репозиторий, 
	 * перед тем как передавать ему вызовы. 
	 */
	public function isActive(){
		return $this->active;
	}

	public function save(PersonaInterface $persona){
		if($this->isActive()){
			return $this->repository->save($persona);
		}
	}

	public function delete(PersonaInterface $persona){
		if($this->isActive()){
			return $this->repository->delete($persona);
		}
	}

	public function getById($id){
		if($this->isActive()){
			return $this->repository->getById($id);
		}
	}
}


Ссылка на исходник в bitbucket.

Кроме проксирующих интерфейс реального репозитория методов, мы видим два служебных, обслуживающих его работу.

Какие пользы сулит использование в сервисе такого подхода?

  1. Улучшенная возможность тестирования. Если бы реальный репозиторий создавался всегда вместе с сервисом, то для тестирования сервиса приходилось бы или конструировать реальное хранилище, либо заменять тестовой заглушкой. Оба вариант тянут накладные расходы и усложняют тест.
  2. Вынесение логики работы с хранилищем — она делегируется Заместителю. Перед рефакторингом, в процесс которого был выделен класс PersonaRepositoryProxy, код сервиса выглядел примерно так:

    repository = $repository;
    	}
    	
    	public function isRepositoryUsed(){
    		return isset($this->repository);
    	}
    	
    	public function create(
    			$gender = self::GENDER_UNDEFINED,
    			array $names = [], 
    			PersonaInterface $father = null,
    			PersonaInterface $mother = null,			
    			DateTimeInterface $dateOfBirth = null, 
    			DateTimeInterface $dateOfDeath = null 
    	){
    		$persona = new Persona($gender, $names);
    		if($this->isRepositoryUsed()){
    			$this->repository->save($persona);
    		}
    		return $persona;
    	}
    	
    	public function delete(PersonaInterface &$persona){
    		if($this->isRepositoryUsed()){
    			$this->repository->delete($persona);
    		}
    		/*
    		 * destroy object
    		 */
    		$persona = null;
    	}
    }
    
    

  3. Не исключается возможность, когда сервис может использоваться без необходимости в сохранении данных. С Proxy это уже обеспечено - достаточно просто не устанавливать реальный репозиторий. Без Заместителя, для поддержки такой логики, потребовались бы свой способ конфигурации подобного поведения и дополнительные проверки.

Дискуссионные моменты: как и любая реализация, приведённый код не есть панацея на все случаи жизни, а лишь способ решения имеющихся, и видимых в самой ближайшей перспективе, проблем. По мере разрастания сервиса и репозитория, возможно данный подход потребует пересмотра и корректировки. Быть может, размещение прокси в пространстве имён сервисного слоя стоит пересмотреть.

Рубрика: PHP, Статьи-заметки | Метки: , , , | Оставить комментарий