Adaptive Programming – Part 3

Início

Lei de Demeter

Conforme foi anunciado na parte 2 os departamentos da empresa agora são compostos de divisões. No diagrama abaixo as classes envolvidas são expostas.

Notamos que para cada lista que compões um objeto de uma classe há necessidade de aumentar o protocolo para abrigar o CRUD correspondente. Por enquanto estamos nos concentrando na mensagem #listarEmpregados. Mais tarde trataremos outras mensagens de forma similar.

Após a introdução da classe Divisão e para manter a semântica de #listarEmpregados como “listar todos os empregados da empresa” (já que o ponto de entrada do processamento está no objeto da classe Empresa) os códigos de #listarEmpregados ficam como a seguir:

Empresa>>#listarEmpregados:

Como não houve alteração da estrutura imediata de Empresa o código é o mesmo.

Departamento>>#listarEmpregados:

No código acima foi introduzida a última linha para imprimir as listas de empregados das divisões.

O código na classe Divisao é o mesmo que o anterior em Departamento.
Divisao>>#listarEmpregados:

Na parte 4 exercitaremos a inclusão de outros métodos que deverão, da mesma maneira que #listarEmpregados, ser incluídos em várias classes.

O file-out até agora segue abaixo:

Object subclass: #Empresa
	instanceVariableNames: 'nome departamentos'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'AdaptiveProgrammingBlogPost-Examples'!

!Empresa methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/16/2012 10:59'!
departamentos
	^ departamentos! !

!Empresa methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/16/2012 10:59'!
nome
	^ nome! !

!Empresa methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/16/2012 10:59'!
nome: anObject
	nome := anObject! !

!Empresa methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 11:21'!
adicionarDepartamento: aDepartamento
	^ self departamentos at: aDepartamento nome put: aDepartamento ! !

!Empresa methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/18/2012 09:51'!
initialize
	departamentos := Dictionary new.
	self
		adicionarDepartamento: (Departamento nome: 'A');
		adicionarDepartamento: (Departamento nome: 'B');
		adicionarDepartamento: (Departamento nome: 'C').

	Empregado reinicieMatriculas.

	(self recuperarDepartamentoNome: 'A')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'João' salario: 5000);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Maria' salario: 6000);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Paulo' salario: 3000).
	(self recuperarDepartamentoNome: 'B')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Carla' salario: 7000);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Pedro' salario: 2000).
	(self recuperarDepartamentoNome: 'C')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Mateus' salario: 5000).

	(self recuperarDepartamentoNome: 'A')
		adicionarDivisao: (Divisao nome: 'D').
	(self recuperarDepartamentoNome: 'B')
		adicionarDivisao: (Divisao nome: 'E');
		adicionarDivisao: (Divisao nome: 'F').
	(self recuperarDepartamentoNome: 'C')
		adicionarDivisao: (Divisao nome: 'G');
		adicionarDivisao: (Divisao nome: 'H');
		adicionarDivisao: (Divisao nome: 'I').

	((self recuperarDepartamentoNome: 'A') recuperarDivisaoNome: 'D')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Paulo' salario: 5200);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Tatiana' salario: 6100);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Joana' salario: 3500).
	((self recuperarDepartamentoNome: 'B') recuperarDivisaoNome: 'E')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Diego' salario: 2200);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Natacha' salario: 8100).
	((self recuperarDepartamentoNome: 'B') recuperarDivisaoNome: 'F')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Carolina' salario: 7100).

	((self recuperarDepartamentoNome: 'C') recuperarDivisaoNome: 'G')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Rodrigo' salario: 4100).
	((self recuperarDepartamentoNome: 'C') recuperarDivisaoNome: 'H')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Pedro' salario: 2200);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Raissa' salario: 8100).
	((self recuperarDepartamentoNome: 'C') recuperarDivisaoNome: 'I')
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Francisco' salario: 5200);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Melissa' salario: 6100);
		adicionarEmpregado: (Empregado matricula: Empregado proximaMatricula nome: 'Betània' salario: 3500).

		! !

!Empresa methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 12:16'!
listarDepartamentos
	self departamentos
		do: [:departamento|
			Transcript
				space;
				show: departamento nome
				] ! !

!Empresa methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/18/2012 09:45'!
listarEmpregados
	self departamentos do: [:departamento|
		Transcript cr; show: '----------------------------- Departamento: '; show: departamento nome.
		departamento listarEmpregados
	]! !

!Empresa methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 11:20'!
recuperarDepartamentoNome: aByteString
	^ self departamentos at: aByteString! !

!Empresa methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 11:42'!
removerDepartamentoNome: aString
	^ self departamentos removeKey: aString! !

Object subclass: #Aplicacao
	instanceVariableNames: 'empresa'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'AdaptiveProgrammingBlogPost-Examples'!

!Aplicacao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 11:01'!
initialize
	empresa := Empresa new! !

!Aplicacao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 07:57'!
listarEmpregadosdoDepartamento: dep
	Transcript
		cr;
		show: 'Empregados:'.
	dep empregados
		do: [ :empregado |
			Transcript
				cr;
				tab;
				show: empregado matricula;
				space;
				show: empregado nome;
				space;
				show: empregado salario ]! !

!Aplicacao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/18/2012 07:38'!
run
	| emp |
	Transcript clear.

	"Departamentos"
	Transcript cr; show: 'Departamentos:'.
	empresa listarDepartamentos.

	"Empregados da empresa"
	Transcript cr; show: 'Empregados da empresa:'.
	empresa listarEmpregados.! !

Object subclass: #Divisao
	instanceVariableNames: 'nome empregados'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'AdaptiveProgrammingBlogPost-Examples'!

!Divisao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
adicionarEmpregado: anEmpregado
	^ self empregados
		at: anEmpregado matricula
		put: anEmpregado! !

!Divisao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
initialize
	empregados := Dictionary  new.
! !

!Divisao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
listarEmpregados
	self empregados
		do: [ :empregado |
			Transcript
				cr;
				tab;
				show: empregado matricula;
				space;
				show: empregado nome;
				space;
				show: empregado salario ]! !

!Divisao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
recuperarEmpregadoMatricula: aSmallInteger
	^ self empregados at: aSmallInteger! !

!Divisao methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
removerEmpregadoMatricula: aSmallInteger
	^ self empregados removeKey: aSmallInteger! !

!Divisao methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
empregados
	^ empregados! !

!Divisao methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
nome
	^ nome! !

!Divisao methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
nome: anObject
	nome := anObject! !

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

Divisao class
	instanceVariableNames: ''!

!Divisao class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:30'!
nome: aString
	^ self new nome: aString! !

Object subclass: #Empregado
	instanceVariableNames: 'matricula nome salario'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'AdaptiveProgrammingBlogPost-Examples'!

!Empregado methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:31'!
matricula
	^ matricula! !

!Empregado methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:31'!
matricula: anObject
	matricula := anObject! !

!Empregado methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:26'!
nome
	^ nome! !

!Empregado methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:26'!
nome: anObject
	nome := anObject! !

!Empregado methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:26'!
salario
	^ salario! !

!Empregado methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:26'!
salario: anObject
	salario := anObject! !

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

Empregado class
	instanceVariableNames: 'proximaMatricula'!

!Empregado class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 07:56'!
initialize
	"
	self initialize
	"
	self reinicieMatriculas! !

!Empregado class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 07:32'!
matricula: anInteger nome: aString salario: aFloat
	^ self new
	      matricula: anInteger;
		nome: aString;
		salario: aFloat ! !

!Empregado class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 07:28'!
nome: aString salario: aFloat
	^ self new
		nome: aString;
		salario: aFloat ! !

!Empregado class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 07:37'!
proximaMatricula
	proximaMatricula := proximaMatricula + 1.
	^ proximaMatricula! !

!Empregado class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 07:55'!
reinicieMatriculas
	proximaMatricula := 0..! !

!Empregado class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/14/2012 21:26'!
ultimaMatricula
	^ proximaMatricula! !

Object subclass: #Departamento
	instanceVariableNames: 'nome empregados divisoes'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'AdaptiveProgrammingBlogPost-Examples'!

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:43'!
adicionarDivisao: aDivisao
	^ self divisoes at: aDivisao nome put: aDivisao ! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 11:30'!
adicionarEmpregado: anEmpregado
	^ self empregados
		at: anEmpregado matricula
		put: anEmpregado! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:59'!
initialize
	empregados := Dictionary  new.
	divisoes := Dictionary  new
! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:48'!
listarDivisoes
	self divisoes
		do: [:divisao|
			Transcript
				space;
				show: divisao nome
				] ! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/18/2012 07:40'!
listarEmpregados
	self empregados
		do: [:empregado | Transcript cr; tab;
			show: empregado matricula; space;
			show: empregado nome; space;
			show: empregado salario].
	self divisoes do: [:divisao|
		Transcript cr; show: 'Divisão: '; show: divisao nome.
		divisao listarEmpregados]! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:45'!
recuperarDivisaoNome: aByteString
	^ self divisoes at: aByteString! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 08:43'!
recuperarEmpregadoMatricula: aSmallInteger
	^ self empregados at: aSmallInteger! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/17/2012 19:46'!
removerDivisaoNome: aString
	^ self divisoes removeKey: aString! !

!Departamento methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 08:48'!
removerEmpregadoMatricula: aSmallInteger
	^ self empregados removeKey: aSmallInteger! !

!Departamento methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/17/2012 19:33'!
divisoes
	^ divisoes! !

!Departamento methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/14/2012 07:24'!
empregados
	^ empregados! !

!Departamento methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/16/2012 09:23'!
nome
	^ nome! !

!Departamento methodsFor: 'accessing' stamp: 'FranciscoAryMartins 6/16/2012 09:23'!
nome: anObject
	nome := anObject! !

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

Departamento class
	instanceVariableNames: ''!

!Departamento class methodsFor: 'as yet unclassified' stamp: 'FranciscoAryMartins 6/16/2012 09:26'!
nome: aString
	^ self new nome: aString! !

Empregado initialize!

Continua na parte 4.

Anúncios

2 comentários

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