Профессиональный ступор (

Духовность™

Продвинутый новичок
Профессиональный ступор (

В последний год я начал понимать, что "что-то не так".

Дело в том, что в последнее время процесс программирования стал как-то в тягость. Раньше, на этапах освоения веб-технологий все шло очень хорошо, делал большие рывки вперед - глаза горели. Но потом что-то случилось. Завяз в своем коде, котрый меня стал попросту угнетать. Да и не столько даже в своем коде, любой код, который я, простите, назову говнокодом, стал мне невыносимо неприятен. Поддерживать такие проекты стало совсем не интересно. А в нормальной конторе с грамотными проектировщиками не работал ни разу - везде недопрограммисты попадались =)

И вот, я оглянулся назад и понял, что в принципе не умею проектировать грамотные веб-приложения. Что значит "грамотные"? Трудно сказать, где начинается тот критерий, где приложение грамотное, а где плохое. Очевидно испытываю банальную потребность в познании шаблонов проектирования, паттернов. Хороших решений.

Сейчас мой код - это "полотно кода", или как так это называется...

PHP:
// подключаем конфиги, функции, классы

// получаем данные 

// подключаем шаблон
Вот пример такого говнища: http://phpclub.ru/paste/index.php?show=2055 (типо модуль какой-то там)

Т.е. приложения не представляют собой модульные решения, а является вот такой массой кода (((

Плюс ко всему стиль написания остался на каком-то далеком уровне - вперёд почти уже не иду.



Я больше че уверен, что в таком положении оказывались многие.

Скажите пожалуйста, как идти вперед? Что в первую очередь нужно сделать, как заставить себя писать иначе?
Сейчас усиленно изучаю паттерны всякие, но пока это не помогает (

ЗЫ: Просьба не писать "чувак убей себя" или "брось это дело" - поздно что-то менять.
 

Kelkos

Сам себе программер
А может проблема не в коде и всякой хрени типа "шаблонов проектирования, паттернов"?
Может проблема в отсутствии интересной цели? ;)
 

Духовность™

Продвинутый новичок
Kelkos
Нет, цели есть. Просто писать как раньше - уже не могу.

Чувствую, что нужно писать как-то по-другому. Мой код мне сейчас совершенно не нравится.
 

Духовность™

Продвинутый новичок
Это не блажь. У меня большой проект попросту загнулся при таком подходе программирования.
 

StUV

Rotaredom
triumvirat
книжки почитай умные - по программированию, проектированию, методикам управления и т.п... - м.б. появятся новые мысли/идеи и снова появится интерес на качественно новом уровне ;)
 

nirex

Новичок
triumvirat
Если есть работа, сиди на ней, займись самопознанием )
Не забивай себе голову своими проектами, просто выполняй тупо машинальную работу, дай остыть самому себе.
 

Angerslave

Новичок
ООП выход есть в твоём случае. Причём нормальное ООП. Может быть стоит на время покодить на другом языке, книжки разные хорошие, это всё да...
 

Kelkos

Сам себе программер
StUV, Angerslave, atv , вы что, всерьёз считаете. что весеннюю хандру можно вылечить книжками по ООП?

лучший вариант - заблочить triumvirat на форуме и пусть съездит в отпуск.. сходит в кино, познакомится с девушками.. А там глядишь и перестанет ипатьнашмоск.
 

StUV

Rotaredom
Kelkos
каждый оценивает исходя из своего восприятия ситуации
слово "хандра" мне незнакомо, отрываться вне работы я тож умею =)))
поэтому единственная причина для меня... - недостаток знаний =)
 

Angerslave

Новичок
Kelkos, ну не знаю, я тоже с трудом перехожу на ООП. И именно умные книжки помогают мне в этом. А списывать все проблемы на мифическую весеннюю хандру это не выход, имхо.
 

kode

never knows best
Re: Профессиональный ступор (

triumvirat
рекомендую переходить на модельную(класс-модель) либо ORM работу с БД

в итоге почти вся логика работы с БД будет вынесена в модели, и тебе не прийдётся лазить по куче кода, исправлять SQL запросы

например:

PHP:
class User {

	protected $id;
	protected $db_data;

	public $edited = false;

	public function __construct($id){
		$where = (is_numeric($id))?array('id'=>$id):array('login'=>$id);

		$db = Registry::get('db');

		$this->db_data = $db->selectRow('users',$where);

		if(empty($this->db_data)){
			throw new Exception("User '{$id}' not found!");
		}

		$this->id = $this->db_data['id'];
		unset($this->db_data['id']);

	}

	public function checkPassword($password){
		return (md5($password) == $this->db_data['password']);
	}

	public function __get($name){
		return $this->db_data[$name];
	}

	/* можно поступить таким способом */
	public function setAvatara($filename){
		
		/* тут тоже два способа - заносить изменения сразу в БД */
		$db = Registry::get('db');
		$db->update('users',array('avatara'=>$filename),array('id'=>$this->id));

		/* или изменять данные на своём уровне, и только потом вносить сразу все изменения */
		$this->db_data['avatara'] = $filename;
		$this->edited = true;		
		return true;
	}

	/* или вот таким */
	public function __set($name,$value){

		if(isset($this->db_data[$name])){
			$this->db_data[$name] = $value;
			$this->edited = true;
		}

	}

	public function __destruct(){
		if($this->edited){
			$db = Registry::get('db');
			$db->update('users',$this->db_data,array('id'=>$this->id));
		}
	}

	/* 
каким способом изменять данные решать тебе: это не единственные способы, у каждого свои достоинства и недостатки 
Например через set* (setName, setLogin, etc) - больше обезьяньей работы, но позволяет более полно абстрагироватся от БД
через __set() удобнее, но структура БД (названия полей например: хотя это очень редкое явление, но возможное) могут поменяться,
тогда прийдётся изменять кучу кода (либо делать механизм алиасов, что тоже гемморой)

	*/

}

class NewUser extends User {
	
	public function __construct($userdata){
		$db = Registry::get('db');
		if(!$this->checkFields($userdata)){
			throw new Exception('Not enough data to add new user!');
		}

		if(!$this->checkExistence($userdata['login'])){
			throw new Exception("User `{$userdata['login']}` already exists!");
		}
		
		if(isset($userdata['id'])){
			unset($userdata['id']);
		}
		
		$db->insert('users',$userdata);
		
		$this->id = $db->insert_id();
		$this->db_data = $userdata;
	}
	
	private function checkExistence($login){
		$db = Registry::get('db');
		return empty($db->selectOne('users',array('login'=>$login)));
	}
}
 

StUV

Rotaredom
kode
а обосновать ? =)

-~{}~ 22.04.08 11:36:

в итоге почти вся логика работы с БД будет вынесена в модели, и тебе не прийдётся лазить по куче кода, исправлять SQL запросы
ты никогда не думал о том, как без орм писать нормально код, чтобы запросы были в одном месте ?..

+
не задумывался ли... - если у тебя изменится структура бд - какой гемор ковырять орм построения многостраничных запросов в структуре модели с кодом под 100Мб ? =)))
 

kode

never knows best
Автор оригинала: StUV
kode
а обосновать ? =)

-~{}~ 22.04.08 11:36:


ты никогда не думал о том, как без орм писать нормально код, чтобы запросы были в одном месте ?..

+
не задумывался ли... - если у тебя изменится структура бд - какой гемор ковырять орм построения многостраничных запросов в структуре модели с кодом под 100Мб ? =)))
Просто проектировать нужно нормально..... + чегото я в своей жизни ниразу невидел SQL-запросов/кода размером в 100 Мб (результаты запросов видел ) :)))

модели != ОРМ - модель имеет большую функциональную насыщенность и абстракцию от БД. А ОРМ, в моём понимании, является почти полностью проекцией БД на модель.

Предложи более удобную схему (предложение при котором с изменением структуры БД прийдётся "перекопать" пол проекта не принимаются)
 

StUV

Rotaredom
SQL-запросов/кода размером в 100 Мб
я про код, в котором запросы размазаны в "виде орм" в иерархии наследования/агрегаций, вместо того, чтобы лежать в plain-виде в одном месте =)

--
зы: вообще, остановлюсь на этом - флейм на эту тему уже был когда-то - все остаются при своем
просто твое заявление "совершенно не в тему" типа "у вас депрессняк - переходите на орм" - улыбнуло ;)

Предложи более удобную схему
читай книжки
этих схем просто до[...] и больше =)
 

kode

never knows best
Автор оригинала: StUV
я про код, в котором запросы размазаны в "виде орм" в иерархии наследования/агрегаций, вместо того, чтобы лежать в plain-виде в одном месте =)

--
зы: вообще, остановлюсь на этом - флейм на эту тему уже был когда-то - все остаются при своем
просто твое заявление "совершенно не в тему" типа "у вас депрессняк - переходите на орм" - улыбнуло ;)


читай книжки
этих схем просто до[...] и больше =)
В общем то и правда что тема отдельного топика, но позволю себе возразить:
> вместо того, чтобы лежать в plain-виде в одном месте
знаем, видели, пользовались, блевало - этакая кучка фекалий типа:

PHP:
      function FnSubwayByCityIdEnum($CityId) { return $this->QueryAll("Select * from FnSubwayByCityIdEnum($1)",array($CityId)); }
      function FnSubwayBySubwayIdEnum($SubwayId) { return $this->QueryAll("Select * from FnSubwayBySubwayIdEnum($1)",array($SubwayId)); }

      function FnStreetByCityIdEnum($CityId) { return $this->QueryAll("Select * from FnStreetByCityIdEnum($1)",array($CityId)); }
      function FnStreetByStreetIdEnum($StreetId) { return $this->QueryAll("Select * from FnStreetByStreetIdEnum($1)",array($StreetId)); }
      function FnStreetByLetterEnum($StreetName) { return $this->QueryAll("Select * from FnStreetByLetterEnum($1)",array($StreetName)); }

      function FnDistrictByCityIdEnum($CityId) { return $this->QueryAll("Select * from FnDistrictByCityIdEnum($1)",array($CityId)); }
      function FnDistrictByDistrictIdEnum($DistrictId) { return $this->QueryAll("Select * from FnDistrictByDistrictIdEnum($1)",array($DistrictId)); }

      function FnMainTypeEnum() { return $this->QueryAll("Select * from FnMainTypeEnum()",array()); }
      function FnMainTypeByMainTypeIdEnum($MainTypeId) { return $this->QueryAll("Select * from FnMainTypeByMainTypeIdEnum($1)",array($MainTypeId)); }

      function FnSubTypeEnum() { return $this->QueryAll("Select * from FnSubTypeEnum()",array()); }
      function FnSubTypeBySubTypeIdEnum($SubTypeId) { return $this->QueryAll("Select * from FnSubTypeBySubTypeIdEnum($1)",array($SubTypeId)); }
      function FnSubTypeByMainTypeIdEnum($MainTypeId) { return $this->QueryAll("Select * from FnSubTypeByMainTypeIdEnum($1)",array($MainTypeId)); }
      function FnSubTypeByMainTypeIdSubTypeIdEnum($MainTypeId, $SubTypeId) { return $this->QueryAll("Select * from FnSubTypeByMainTypeIdSubTypeIdEnum($1, $2)",array($MainTypeId, $SubTypeId)); }

      function FnFirmEnum() { return $this->QueryAll("Select * from FnFirmEnum()",array()); }
      function FnFirmByFirmIdEnum($FirmId) { return $this->QueryAll("Select * from FnFirmByFirmIdEnum($1)",array($FirmId)); }
      function FnFirmBySectionIdEnum($SectionId) { return $this->QueryAll("Select * from FnFirmBySectionIdEnum($1)",array($SectionId)); }
      function FnFirmBySectionIdEnumWithPage($SectionId, $Start, $OnPage) { return $this->QueryAll("Select * from FnFirmBySectionIdEnumWithPage($1, $2, $3)",array($SectionId, $Start, $OnPage)); }
      function FnFirmBySectionIdRecomendedEnumWithPage($SectionId, $Start, $OnPage) { return $this->QueryAll("Select * from FnFirmBySectionIdRecomendedEnumWithPage($1, $2, $3)",array($SectionId, $Start, $OnPage)); }

      function FnOfficeByOfficeIdEnum($OfficeId) { return $this->QueryAll("Select * from FnOfficeByOfficeIdEnum($1)",array($OfficeId)); }
      function FnOfficeByFirmIdEnum($FirmId) { return $this->QueryAll("Select * from FnOfficeByFirmIdEnum($1)",array($FirmId)); }

      function FnSectionEnum() { return $this->QueryAll("Select * from FnSectionEnum()",array()); }
      function FnSectionBySectionIdEnum($SectionId) { return $this->QueryAll("Select * from FnSectionBySectionIdEnum($1)",array($SectionId)); }
      function FnSectionByCityIdEnum($CityId) { return $this->QueryAll("Select * from FnSectionByCityIdEnum($1)",array($CityId)); }

      function FnSetMainOfficeByOfficeId($OfficeId) { return $this->QueryAll("Select * from FnSetMainOfficeByOfficeId($1)",array($OfficeId)); }
      function FnCrossTypeByObjectIdMetaTypeIdEnum($ObjectId, $MetaTypeId) { return $this->QueryAll("Select * from FnCrossTypeByObjectIdMetaTypeIdEnum($1, $2)",array($ObjectId, $MetaTypeId)); }

      function FnEventByEventIdEnum($EventId) { return $this->QueryAll("Select * from FnEventByEventIdEnum($1)",array($EventId)); }
      function FnEventBySectionIdMetaTypeIdEnum($SectionId, $MetaTypeId) { return $this->QueryAll("Select * from FnEventBySectionIdMetaTypeIdEnum($1, $2)",array($SectionId, $MetaTypeId)); }
      function FnEventByFirmIdMetaTypeIdEnum($FirmId, $MetaTypeId) { return $this->QueryAll("Select * from FnEventByFirmIdMetaTypeIdEnum($1, $2)",array($FirmId, $MetaTypeId)); }
      function FnEventByMetaTypeIdEnum($MetaTypeId) { return $this->QueryAll("Select * from FnEventByMetaTypeIdEnum($1)",array($MetaTypeId)); }

      function FnEventCountBySectionIdEnum($SectionId) { return $this->QueryAll("Select * from FnEventCountBySectionIdEnum($1)",array($SectionId)); }
      function FnEventCountBySectionIdMetaTypeIdEnum($SectionId, $MetaTypeId) { return $this->QueryAll("Select * from FnEventCountBySectionIdMetaTypeIdEnum($1, $2)",array($SectionId, $MetaTypeId)); }

      function FnOnSectionEventBySectionIdMetaTypeIdEnum($SectionId, $MetaTypeId) { return $this->QueryAll("Select * from FnOnSectionEventBySectionIdMetaTypeIdEnum($1, $2)",array($SectionId, $MetaTypeId)); }
      function FnOnMainEventBySectionIdMetaTypeIdEnum($SectionId, $MetaTypeId) { return $this->QueryAll("Select * from FnOnMainEventBySectionIdMetaTypeIdEnum($1, $2)",array($SectionId, $MetaTypeId)); }
      function FnOnEverywhereEventBySectionIdMetaTypeIdEnum($SectionId, $MetaTypeId) { return $this->QueryAll("Select * from FnOnEverywhereEventBySectionIdMetaTypeIdEnum($1, $2)",array($SectionId, $MetaTypeId)); }

      function FnAllActiveEventBySectionIdMetaTypeIdEnum($SectionId, $MetaTypeId) { return $this->QueryAll("Select * from FnAllActiveEventBySectionIdMetaTypeIdEnum($1, $2)",array($SectionId, $MetaTypeId)); }
      function FnAllArchiveEventBySectionIdMetaTypeIdEnumWithPage($SectionId, $MetaTypeId, $Start, $OnPage) { return $this->QueryAll("Select * from FnAllArchiveEventBySectionIdMetaTypeIdEnumWithPage($1, $2, $3, $4)",array($SectionId, $MetaTypeId, $Start, $OnPage)); }

      function FnAllActiveEventByFirmIdEnum($FirmId) { return $this->QueryAll("Select * from FnAllActiveEventByFirmIdEnum($1)",array($FirmId)); }
      function FnTotalEventCountByFirmId($FirmId) { return $this->QueryAll("Select * from FnTotalEventCountByFirmId($1)",array($FirmId)); }


      function FnTotalActiveEventCountByFirmId($FirmId) { return $this->QueryAll("Select * from FnTotalActiveEventCountByFirmId($1)",array($FirmId)); }
//      function FnTotalEventCountByFirmId($FirmId) { return $this->QueryAll("Select * from FnTotalEventCountByFirmId($1)",array($FirmId)); }
      
      function FnAllEventByFirmIdEnum($FirmId) { return $this->QueryAll("Select * from FnAllEventByFirmIdEnum($1)",array($FirmId)); }
//      function FnAllActiveEventByFirmIdEnum($FirmId) { return $this->QueryAll("Select * from FnAllActiveEventByFirmIdEnum($1)",array($FirmId)); }


      function FnImageByObjectIdImageTypeIdEnum($ObjectId, $ImageTypeId) { return $this->QueryAll("Select * from FnImageByObjectIdImageTypeIdEnum($1, $2)",array($ObjectId, $ImageTypeId)); }

      function FnEventBySectionIdMetaTypeIdCreateDateEnum($SectionId, $MetaTypeId, $CreateDate) { return $this->QueryAll("Select * from FnEventBySectionIdMetaTypeIdCreateDateEnum($1, $2, $3)",array($SectionId, $MetaTypeId, $CreateDate)); }
      function FnEventBySectionIdMetaTypeIdCreateDateEnum2($SectionId, $MetaTypeId, $CreateDate) { return $this->QueryAll("Select * from FnEventBySectionIdMetaTypeIdCreateDateEnum($1, $2, $3)",array($SectionId, $MetaTypeId, $CreateDate)); }


      function FnTotalEventCount() { return $this->QueryAll("Select * from FnTotalEventCount()",array()); }

      function FnFilmEnumWithPage($Start, $OnPage) { return $this->QueryAll("Select * from FnFilmEnumWithPage($1, $2)",array($Start, $OnPage)); }

      function FnSheduleBySheduleIdEnum($SheduleId) { return $this->QueryAll("Select * from FnSheduleBySheduleIdEnum($1)",array($SheduleId)); }

      function FnSheduleByObjectIdMetaTypeIdEnum($ObjectId, $MetaTypeId, $Time) { return $this->QueryAll("Select * from FnSheduleByObjectIdMetaTypeIdEnum($1, $2, $3)",array($ObjectId, $MetaTypeId, $Time)); }
      function FnSheduleByEventIdMetaTypeIdEnum($EventId, $MetaTypeId, $Time) { return $this->QueryAll("Select * from FnSheduleByEventIdMetaTypeIdEnum($1, $2, $3)",array($EventId, $MetaTypeId, $Time)); }
      function FnSheduleByMetaTypeIdEnum($MetaTypeId, $Time) { return $this->QueryAll("Select * from FnSheduleByMetaTypeIdEnum($1, $2)",array($MetaTypeId, $Time)); }


      function FnPeopleByPeopleIdEnum($PeopleId) { return $this->QueryAll("Select * from FnPeopleByPeopleIdEnum($1)",array($PeopleId)); }
      function FnPeopleByObjectIdMetaTypeIdEnum($ObjectId, $MetaTypeId) { return $this->QueryAll("Select * from FnPeopleByObjectIdMetaTypeIdEnum($1, $2)",array($ObjectId, $MetaTypeId)); }

      function FnAdvancedInformationByAdvancedInformationIdEnum($AdvancedInformationId) { return $this->QueryAll("Select * from FnAdvancedInformationByAdvancedInformationIdEnum($1)",array($AdvancedInformationId)); }
      function FnAdvancedInformationByObjectIdMetaTypeIdEnum($ObjectId, $MetaTypeId) { return $this->QueryAll("Select * from FnAdvancedInformationByObjectIdMetaTypeIdEnum($1, $2)",array($ObjectId, $MetaTypeId)); }

      function FnFilmByFilmIdEnum($FilmId) { return $this->QueryAll("Select * from FnFilmByFilmIdEnum($1)",array($FilmId)); }


      //03.02.2008
      function FnFilmPremiereByMonthEnum($Premiere, $Limit) { return $this->QueryAll("Select * from FnFilmPremiereByMonthEnum($1, $2)",array($Premiere, $Limit)); }
      function FnActiveFilmEnum() { return $this->QueryAll("Select * from FnActiveFilmEnum()",array()); }
      function FnAllActiveEventBySectionIdMetaTypeIdObjectIdEnum($SectionId, $MetaTypeId, $ObjectId) { return $this->QueryAll("Select * from FnAllActiveEventBySectionIdMetaTypeIdObjectIdEnum($1, $2, $3)",array($SectionId, $MetaTypeId, $ObjectId)); }
      function FnAllPerfomanceEventBySectionIdMetaTypeIdObjectIdEnum($SectionId, $MetaTypeId, $ObjectId) { return $this->QueryAll("Select * from FnAllPerfomanceEventBySectionIdMetaTypeIdObjectIdEnum($1, $2, $3)",array($SectionId, $MetaTypeId, $ObjectId)); }
....
(выше приведённый код не мой)

или ещё хуже.....ввиде строк......

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

> "у вас депрессняк - переходите на орм"
кстате, дельный совет :))))

> читай книжки этих схем просто до[...] и больше =)
я щитаю это отговорка :)
 

StUV

Rotaredom
я щитаю это отговорка
да
ибо поиском по форуму можно найти минимум два флейма по сотне постов каждый - в которых детально "оспорены" плюсы и минусы обоих подходов
там я все сказал ;)
 
Сверху