Hexagonal Architecture in Smalltalk series – part 2

Post inicial


UI Adapter

Na pequena aplicação que vamos construir temos uma interface simples com uma caixa de texto, quatro botões e uma área para mostrar mensagens. Para executá-la use o código mostrado abaixo.

A interface é implementada como uma Humble View (Ver o artigo GUI Architectures de Martin Fowler) não tendo nenhuma lógica complexa. Desta forma o teste da interface é trivial.

O objeto responsável por adaptar a interface e o domínio receberá eventos de ambos que converterá em chamadas adequadas para manter o domínio e a interface do usuário sincronizados. Vamos mostrar inicialmente a aplicação desktop deixando a aplicação web para depois.

DesktopAdapter

A classe DesktopAdapter não tem estado e apenas executa wiring entre a interface do usuário e o domínio representadas pelas suas variáveis de instância view e domain. O seu código principal está todo contido no método de inicialização executado na criação do objeto.

O idioma representado pela chamada ao método #when:do: efetua o registro de eventos no qual o adapter está interessado tanto junto à interface do usuário quanto junto ao domínio.

O diagrama de classes e os diagramas de sequência a seguir ilustram o que o código acima efetuará.

O diagrama para o pressionameto do botão Decrement é similar ao acima.

O código completo do adapter segue abaixo. No próximo artigo vamos nos ater ao domínio e à interface do usuário.

'From Pharo1.4 of 18 April 2012 [Latest update: #14457] on 27 October 2012 at 9:28:54 pm'!
Object subclass: #DesktopAdapter
	instanceVariableNames: 'view domain'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'HexagonalArchitecture-Example-Value'!

!DesktopAdapter methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/26/2012 19:55'!
initialize
	super initialize .

	view when: ViewOpened do: [
		view setTextEntry: domain value asString
	] .

	view when: ResetButtonPressed do: [
		domain value: 0.
	] .

	view when: UpdateButtonPressed do: [
		domain setValue: view textEntry.
		view showMessage: '@@ Domain updated to ', domain value asString
	] .

	view when: IncrementButtonPressed do: [
		domain incrementValue
	] .

	view when: DecrementButtonPressed do: [
		domain decrementValue
	] .

	domain when: ValueChanged do: [
		view setTextEntry: domain value asString .
		view showMessage: '## Domain updated to ', domain value asString
	] ! !

!DesktopAdapter methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/23/2012 13:51'!
domain: aDomain
	domain := aDomain! !

!DesktopAdapter methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/23/2012 13:53'!
view
	^ view! !

!DesktopAdapter methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/23/2012 13:51'!
view: aView
	view := aView! !

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!

DesktopAdapter class
	instanceVariableNames: ''!

!DesktopAdapter class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/23/2012 13:48'!
domain: aDomain view: aView
	^ self basicNew
		domain: aDomain ;
		view: aView;
		initialize  ! !
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s