Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / DDD Vs Four- Tier Layered Architecture / 15 сообщений из 15, страница 1 из 1
10.03.2012, 15:15:32
    #37697780
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Приветствую!

В чем могут заключаться преимущества domain -driven design над традиционной четырехуровневой? Интересуют именно de- facto. Буду весьма признателен за информацию.
...
Рейтинг: 0 / 0
10.03.2012, 15:24:39
    #37697783
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-void,
а про RPC и 60тык записей статья уже готова?
...
Рейтинг: 0 / 0
10.03.2012, 15:40:37
    #37697805
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Приветствую, Petro123!

..tion-W-under construction-W-un.... : -)
Там QuickSearch помог, что- то вроде этого -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
...
public QuickSearchWindow() {

...

FilterField filterField = new FilterField(application, tableName, columnName, columnId, matchPattern, className);
...
    private class QSFormFieldFactory extends DefaultFieldFactory {
    	public QSFormFieldFactory() {
        }
        @Override
        public Field createField(Item item, Object propertyId, Component uiContext) {
            Field f;
            
            if("qsValue".equals(propertyId)) return filterField; 
            else return null;
        }
    }

...

public class FilterField extends CustomField {
	public static final Logger LOG = Logger.getLogger(FilterField.class);
	private TextField tf;
	private Table t;

	private String tableName; 
	private String columnName;
	private String matchPattern;
	
	private Item selectedSourceItem;

	private Application application;
	private J2EEConnectionPool j2eeConnectionPool;
	private SQLContainer sqlContainer;
	
	private String columnId;
	private String className;
	private String uSelected;

	/**
	 * @param sql
	 */
	public FilterField(final MainApplication application, final String tableName, 
			final String columnName, final String columnId, 
				final String matchPattern, final String className) {
		this.application = application; 
		this.tableName = tableName;
		this.columnName = columnName;
		this.matchPattern = matchPattern;
		this.columnId = columnId;
		this.className = className;
		
		tf = new TextField();
        tf.setWidth("25em");
		tf.focus();
		
		VerticalLayout vl = new VerticalLayout();
		vl.setMargin(false);
		vl.setSpacing(true);
		
		vl.addComponent(tf);
		vl.setComponentAlignment(tf, Alignment.TOP_LEFT);
		
	    j2eeConnectionPool = new J2EEConnectionPool(DBPool.getInstance("jdbc/oracle-9i-athletes").getPool());     
        FreeformQuery query = new FreeformQuery("select * from " + 
        		tableName + " where upper("+columnName+") like upper('%"+matchPattern+"%')", j2eeConnectionPool);                
        
        try {   
           sqlContainer = new SQLContainer(query);           
        } 
        catch(SQLException e) {
        	LOG.warn("StackTrace: ", e);
        }
		
		t = new Table();
		t.setStyleName("iso3166");
		t.setSelectable(true);
		t.setMultiSelect(false);
		t.setContainerDataSource(sqlContainer);
		t.setColumnReorderingAllowed(true);        
        t.setColumnCollapsingAllowed(true);
        t.addListener(new ItemClickListener() {
			public void itemClick(ItemClickEvent event) {
				Item item = t.getItem(event.getItemId());
			    Object id = columnId;
			    String record;
			    
			    String outerId = null;
			    String nativeId = null;
			    
			    if(className.equals("OrganizationsHandbook")) {
			    	outerId = "ORG_ID";
			    	nativeId = "orgId";
			    } else if (className.equals("CargoGroupHandbook")) {
			    	outerId = "GO10_ID";
			    	nativeId = "go10id";
			    }
			    
			    String hql = "FROM com.intellex.marksist.hbn.model." + className + " E " +
			    			 "WHERE E." + nativeId + " = :" + outerId + " " +
			    			 "AND E.recdatebegin <= SYSDATE " +
			    			 "AND E.recdateend > SYSDATE ";			    
			    
			    Session sess = HibernateUtil.getMarksistSessionFactory().openSession();
	    		sess.beginTransaction();
			    
			    Query query = sess.createQuery(hql);
			    query.setParameter(outerId, new Integer(Integer.parseInt(item.getItemProperty(id).toString())));
			    List results = query.list();
	    	    sess.close();

	    	    OrganizationsHandbook organizationsHandbook = null;
	    	    CargoGroupHandbook cargoGroupHandbook = null;
	    	    
			    if(className.equals("OrganizationsHandbook")) {
			    	organizationsHandbook = (OrganizationsHandbook)results.get(0);
			    	uSelected = item.getItemProperty(id) + " : " + organizationsHandbook.getShortname();
		    	    tf.setInputPrompt(organizationsHandbook.getShortname());
			    } else if(className.equals("CargoGroupHandbook")) {
			    	cargoGroupHandbook = (CargoGroupHandbook)results.get(0);
			    	uSelected = item.getItemProperty(id) + " : " + cargoGroupHandbook.getGo10name();
		    	    tf.setInputPrompt(cargoGroupHandbook.getGo10name());
			    }
			}			
		}); 
        tf.setTextChangeEventMode(TextChangeEventMode.LAZY);        
		tf.setTextChangeTimeout(200);        
		tf.addListener(new TextChangeListener() {
			@Override
			public void textChange(final TextChangeEvent event) {
				FreeformQuery query = new FreeformQuery("select * from (" + tableName + ")" + 
						"where UPPER(" + columnName + ")" + " like UPPER('%" + event.getText() + "%')", 
							j2eeConnectionPool);
				try {   
					sqlContainer = new SQLContainer(query);
				} 
				catch (SQLException e) {           			
					LOG.warn("StackTrace: ", e);
				}
				
				t.setContainerDataSource(sqlContainer);
			}
		});		

		vl.addComponent(tf);
		vl.setComponentAlignment(tf, Alignment.BOTTOM_LEFT);

		vl.addComponent(t);
		vl.setComponentAlignment(t, Alignment.BOTTOM_LEFT);
		
		setCompositionRoot(vl);        
	}   
	/**
	 * @return
	 */
	public String getTextFieldVal()  {
		return uSelected;
	}
	/**
	 * @return
	 */
	@Override        
	public Class<?> getType() {            
		return Boolean.class;        
	}
}
...
Рейтинг: 0 / 0
10.03.2012, 15:51:13
    #37697813
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-void,
заметь, и я и ты говорим о текстовом анализе (а-ля статья) ;)
А ты мне кодом.
Заметь, в Java код, как всегда - многословные простыни.
...
Рейтинг: 0 / 0
10.03.2012, 16:13:29
    #37697828
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Petro123,

О том и толкуем. А как говорил Старый Младенец 老子, "кто много говорит, тот часто терпит неудачу."
Надо почитать статьи о DDD.
...
Рейтинг: 0 / 0
10.03.2012, 22:15:49
    #37698145
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-voidНадо почитать статьи о DDD.
воот. А то как-то всё - в одну сторону. Интервью один за другим.
imho :)
...
Рейтинг: 0 / 0
10.03.2012, 22:51:34
    #37698174
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-voidВ чем могут заключаться преимущества domain -driven design над традиционной четырехуровневой? Интересуют именно de- facto. Буду весьма признателен за информацию.
Tier это физические слои. Layer - логические. Это совсем не одно и то же.
Что такое "традиционная четырех уровневая"?
...
Рейтинг: 0 / 0
10.03.2012, 23:28:02
    #37698198
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Petro123, разделяю IMHO : -)

Приветствую, Blazkowicz!

Вот она, насколько я понимаю -
...
Рейтинг: 0 / 0
10.03.2012, 23:47:49
    #37698221
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Blazkowicz, еще вопрос возник - не могли бы вы попутно, хотя бы вкратце, раскрыть разницу между значениями, вкладываемыми в понятия Tier и Layer ?

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

Еще что- наверное, традиционной можно назвать трехзвенку(при тонком клиенте), в топике же речь идет об N-звенной архитектуре.
...
Рейтинг: 0 / 0
11.03.2012, 09:26:57
    #37698398
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-void,
- чистой абстракции нет, т.к. при архитектуре на рисунке приходится руками писать 4 одинаковых ПОЧТИ класса.
Так что архитектура впрямую и неабстрактно влияет на код
авторЕще что- наверное, традиционной можно назвать трехзвенку(при тонком клиенте), в топике же речь идет об N-звенной архитектуре.
особой разницы нет, т.к. на верхнем уровне 3 звена, внутри в коде "один корж торта" делится ещё на N звеньев.
Зависит от контекста.
...
Рейтинг: 0 / 0
11.03.2012, 09:40:26
    #37698410
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Petro123, согласен, но почему приходится писать 4 класса и на верхнем уровне 3 звена? Еще не совсем ясно деление на физические и логические слои.
...
Рейтинг: 0 / 0
11.03.2012, 09:54:08
    #37698421
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-void,
Да вот, я не в курсе, почему фреймворк zkoss в своей демке для класса Person(Имя, возраст) имеет 200 строк кода и это ещё без DTO\VO

package com.baculsoft.zk.bean;

import java.util.Date;

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
/**
 *
 * @author edw
 * @created Jan 5, 2011, 1:21:07 PM
 * @purpose Person
 */
public class Person {
    
    private String name;
    private int age;
    private String gender;
    private Date birthdate;

    public Person(String name, int age, String gender, Date birthdate) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.birthdate = birthdate;
    }

    public Person() {
    }    

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getBirthdate() {
        return birthdate;
    }

    public void setBirthdate(Date birthdate) {
        this.birthdate = birthdate;
    }

}

==============================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class catalog="test" name="com.baculsoft.zk.bean.Person" table="person">
    <id name="name" type="string">
      <column length="20" name="name"/>
      <generator class="assigned"/>
    </id>
    <property name="gender" type="string">
      <column length="10" name="gender"/>
    </property>
    <property name="birthdate" type="date">
      <column length="10" name="birthdate"/>
    </property>
    <property name="age" type="java.lang.Integer">
      <column name="age"/>
    </property>
  </class>
</hibernate-mapping>

==================
package com.baculsoft.zk.dao;

import com.baculsoft.zk.bean.Person;
import java.util.List;
import org.hibernate.Session;

// disini pake hibernate util bawaan zkoss
import org.zkoss.zkplus.hibernate.HibernateUtil;

public class PersonDAO {

    public List<Person> findAll() throws Exception {
        Session session = HibernateUtil.getSessionFactory().openSession();
        return (List<Person>) session.createCriteria(Person.class).list();
    }

    public boolean delete(Person person) throws Exception {
        if (person == null) {
            throw new Exception("empty person");
        }
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.delete(person);
        session.flush();
        session.close();
        return true;
    }

    public boolean insert(Person person) throws Exception {
        if (person == null) {
            throw new Exception("empty person");
        }
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.save(person);
        session.flush();
        session.close();
        return true;
    }

    public boolean update(Person person) throws Exception {
        if (person == null) {
            throw new Exception("empty person");
        }
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.update(person);
        session.flush();
        session.close();
        return true;
    }
}

===============
package com.baculsoft.zk.service;

import com.baculsoft.zk.bean.Person;
import com.baculsoft.zk.dao.PersonDAO;
import java.util.List;
import org.apache.log4j.Logger;
import org.zkoss.zk.ui.util.GenericForwardComposer;

public class PersonService extends GenericForwardComposer {

    private PersonDAO dao = new PersonDAO();
    private Person person = new Person();
    
    private Logger logger = Logger.getLogger(PersonService.class);

    public Person getCurrent() {
        return person;
    }

    public void setCurrent(Person person) {
        this.person = person;
    }

    public List<Person> getAllPersons() {
        try {
            return dao.findAll();
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            return null;
        }

    }

    public void onClick$add() {
        try {
            Person nowPerson = new Person(person.getName(), person.getAge(), person.getGender(), person.getBirthdate());
            dao.insert(nowPerson);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }

    public void onClick$update() {
        try {
            dao.update(person);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }

    public void onClick$delete() {
        try {
            dao.delete(person);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
    }
}


- физические и логические, это когда Хранилище-одно, а физически может быть на 10 машинах.
На логической схеме по ГОСТ рисуется одним квадратиком.
...
Рейтинг: 0 / 0
19.03.2012, 14:50:30
    #37711802
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Да, и почему- то в findAll не закрыта сессия; в моем представлении это должно выглядеть примерно так -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
    public List<Person> findAll() {
    	try {
	        session = HibernateUtil.getSessionFactory().openSession();
	        list = session.createCriteria(Person.class).list();
	     } finally {
		      if(session != null && session.isOpen()) {
		        session.close();
		      }    
		}
        return list; 
    }
...
...
Рейтинг: 0 / 0
19.03.2012, 15:22:21
    #37711870
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
ivanov-void,
ты эту простынь за образец взял что-ли?
ЗЫ. Сессию хибера лучше открывать в начале реквеста и закрывать в конце. А не дробить транзакции так мелко.
...
Рейтинг: 0 / 0
19.03.2012, 15:31:40
    #37711892
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDD Vs Four- Tier Layered Architecture
Petro123, за образец, так и есть.
Хорошо, благодарю, возьму на заметку.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / DDD Vs Four- Tier Layered Architecture / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]