Hexagonal Architecture in Smalltalk series – part 3

Post inicial


Domain

Para representar o domínio o código escolhido é bem simples. Uma classe Value é um value holder que armazena um número inteiro e uma API para leitura, escrita, incrementar e decrementar o citado número.

Note que para alterar o valor temos dois métodos: #value: e #setValue:. O método #value: é de uso geral e dispara um evento. Já o método #setValue: também altera o valor sem no entanto disparar um evento. #setValue: é útil para evitar chamadas circulares intermináveis e é usado pelo adapter em duas situações: quando um evento oriundo da interface provoca uma alteração no domínio e não se deseja que um evento seja disparado pelo domínio causando uma nova alteração na interface com um novo disparo e assim por diante; na outra direção o mesmo se dá quando o evento inicial ocorre por um disparo no domínio levando à necessidade de sincronização do valor exibido na interface.

Como o código da classe é muito trivial vamos nos ater a simplesmente incluí-lo a seguir.

'From Pharo1.4 of 18 April 2012 [Latest update: #14457] on 27 October 2012 at 10:01:46 pm'!
Object subclass: #Value
	instanceVariableNames: 'value announcer'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'HexagonalArchitecture-Example-Value'!

!Value methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/23/2012 20:49'!
setValue: anObject
	value := anObject! !

!Value methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/23/2012 21:53'!
value: aSmallInteger
	self setValue: aSmallInteger .
	announcer announce: ValueChanged new! !

!Value methodsFor: 'events-registering' stamp: 'FranciscoAryMartins 10/23/2012 16:18'!
when: aByteSymbol do: aBlockClosure
	announcer when: aByteSymbol do: aBlockClosure .! !

!Value methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/24/2012 19:34'!
decrementValue
	self value: self value - 1! !

!Value methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/23/2012 16:19'!
initialize
	super initialize .
	announcer := Announcer new! !

!Value methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/23/2012 21:48'!
value
	^ value! !

!Value methodsFor: 'updating' stamp: 'FranciscoAryMartins 10/24/2012 19:33'!
incrementValue
	self value: self value + 1! !

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

Value class
	instanceVariableNames: ''!

!Value class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/23/2012 13:50'!
value: aSmallInteger
	^ self new
		value: aSmallInteger ! !

View

A classe DesktopView representa a interface do usuário e usa o framework Polymorph na sua implementação. É também bastante trivial em sua maior parte sendo que a referência ao framework de construção de interface praticamente se restringe ao método #initialize onde o layout e os widgets são criados.

Abaixo segue o código completo da interface e no próximo post implementaremos a mesma aplicação na Web.

'From Pharo1.4 of 18 April 2012 [Latest update: #14457] on 27 October 2012 at 10:33:27 pm'!
StandardWindow subclass: #DesktopView
 instanceVariableNames: 'textEntry messageDisplay'
 classVariableNames: ''
 poolDictionaries: ''
 category: 'HexagonalArchitecture-Example-Value'!

!DesktopView methodsFor: 'events-registering' stamp: 'FranciscoAryMartins 10/23/2012 20:36'!
when: anAnnoucement do: aBlockClosure
 self announcer when: anAnnoucement do: aBlockClosure .! !

!DesktopView methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/23/2012 21:47'!
open
 super open.
 self announcer announce: ViewOpened.! !

!DesktopView methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/24/2012 19:09'!
setTextEntry: aString
 textEntry setText: aString.
 textEntry acceptTextInModel ! !

!DesktopView methodsFor: 'accessing' stamp: 'FranciscoAryMartins 10/24/2012 19:14'!
textEntry
 ^ textEntry getText ! !

!DesktopView methodsFor: 'event handling' stamp: 'FranciscoAryMartins 10/24/2012 19:39'!
decrementButtonPressed
 announcer announce: (DecrementButtonPressed new)! !

!DesktopView methodsFor: 'event handling' stamp: 'FranciscoAryMartins 10/24/2012 19:27'!
incrementButtonPressed
 announcer announce: (IncrementButtonPressed new)! !

!DesktopView methodsFor: 'event handling' stamp: 'FranciscoAryMartins 10/23/2012 22:01'!
resetButtonPressed
 announcer announce: (ResetButtonPressed new)! !

!DesktopView methodsFor: 'event handling' stamp: 'FranciscoAryMartins 10/23/2012 20:32'!
updateButtonPressed
 announcer announce: (UpdateButtonPressed new)! !

!DesktopView methodsFor: 'initialization' stamp: 'FranciscoAryMartins 10/26/2012 20:03'!
initialize
 super initialize .
 self setLabel: 'Hexagonal Architeture Example: Desktop View'.
 self addMorph: (textEntry := self newTextEntryFor: (ValueHolder new contents: 'Nothing yet') getText: #contents setText: #contents: help: 'Value text entry') frame: (0@0 corner: 1@0.33).
 self addMorph: (self newButtonFor: self action: #resetButtonPressed label: 'Reset' help: 'Press me for reset!!') frame: (0@0.33 corner: 0.25@0.67).
 self addMorph: (self newButtonFor: self action: #updateButtonPressed label: 'Update' help: 'Press me for update!!') frame: (0.25@0.33 corner: 0.5@0.67).
 self addMorph: (self newButtonFor: self action: #incrementButtonPressed label: 'Increment' help: 'Press me for increment!!') frame: (0.5@0.33 corner: 0.75@0.67).
 self addMorph: (self newButtonFor: self action: #decrementButtonPressed label: 'Decrement' help: 'Press me for decrement!!') frame: (0.75@0.33 corner: 1@0.67).
 self addMorph: (messageDisplay := self newTextEntryFor: (ValueHolder new contents: 'No message yet') getText: #contents setText: #contents: help: 'Message display') frame: (0@0.67 corner: 1@1). ! !

!DesktopView methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 10/26/2012 20:04'!
showMessage: aByteString
 messageDisplay setText: aByteString ! !

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