 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
marcosmodolo Aprendiz

Registrado: Quinta-Feira, 25 de Janeiro de 2007 Mensagens: 257
|
Enviada: Qua Nov 21, 2007 11:59 am Assunto: Orientação a Objeto. |
|
|
Pessoal, estou comecando agora com programacao orientada a objeto e gostaria de algumas sugestões de melhoria no código abaixo e algumas dicas tbm de como chegar no objetivo que eu quero.
Código: | TMyObject = class
Tipo:string[1];
CodMunic:string[5];
DataEnvio:string[8];
HoraEnvio:string[6];
Competencia:string[6];
Movimento:string[1];
CNPJ:string[14];
Origem:string[2];
Nome:string[55];
Departamento:string[55];
Cidade:string[30];
function SetNome (Nome:String):string;
function SetDepartamento (Depart:String):string;
function SetCidade (Cidade:String):string;
constructor Create;
end;
constructor TMyObject.Create;
begin
inherited Create;
try
Form1.cdsTeste.Open;
self.Tipo:= '1';
Self.CodMunic:= Form1.cdsteste.fieldbyname('CODSINPAS').AsString;
Self.DataEnvio:= FormatDateTime('yyyymmdd',Date);
self.HoraEnvio:= StringReplace(TimeToStr(Time),':','',[rfReplaceAll]);
self.Competencia:= FormatDateTime('yyyymm',Date);
self.Movimento:= '1';
self.CNPJ:= Form1.cdsTeste.fieldbyname('CNPJ').AsString;
self.Origem:= '44';
Self.SetNome(Form1.cdsTeste.fieldbyname('TITULO').AsString);
Self.SetDepartamento('OBRAS E MEIO AMBIENTE');
self.SetCidade(Form1.cdsTeste.fieldbyname('MUNICIPIO').AsString);
finally
Form1.cdsTeste.Close;
end;
end;
function TMyObject.SetCidade(Cidade: String): string;
begin
Self.Cidade:= Cidade;
if Length(Self.Cidade) < (SizeOf(self.Cidade) -1) then
begin
while Length(Self.Cidade) < (SizeOf(self.Cidade) -1) do
begin
Self.Cidade:= Self.Cidade + ' ';
end;
end;
Result:= Self.Cidade;
end;
function TMyObject.SetDepartamento (Depart:String):string;
begin
Self.Departamento:= Depart;
if Length(Self.Departamento) < (SizeOf(self.Departamento) -1) then
begin
while Length(Self.Departamento) < (SizeOf(self.Departamento) -1) do
begin
Self.Departamento:= Self.Departamento + ' ';
end;
end;
Result:= self.Departamento;
end;
function TMyObject.SetNome(Nome: String): string;
begin
self.Nome:= Nome;
if Length(Self.Nome) < (SizeOf(self.Nome) -1) then
begin
while Length(Self.Nome) < (SizeOf(self.Nome) -1) do
begin
Self.Nome:= Self.Nome + ' ';
end;
end;
Result:= Self.Nome;
end;
|
Eu gostaria que as variaveis desse objeto não pudessem ser atribuidas diretamente.
Ex: MyObject.Nome:= 'MARCOS';
E sim somente para funcao SetNome, para poder manter a integridade da regra do preenchimento do tamanho total declarado na variavel, e para obter seu valor seria atraves de uma funcao GetNome (ainda não criada no código acima).
Alguem poderia me ajudar a estruturar essa classe da maneira mais correta com essas regras que eu disse?
Grato,
Marcos |
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
|
Voltar ao Topo |
|
 |
marcosmodolo Aprendiz

Registrado: Quinta-Feira, 25 de Janeiro de 2007 Mensagens: 257
|
Enviada: Qua Nov 21, 2007 12:55 pm Assunto: |
|
|
Dei uma olhada mas ainda nao consegui o que eu quero, sera que isso é possível? Nao deixar atribuir diretamente valor a uma variavel da classe, sendo somente possivel atraves de uma funcao SETs... da vida?? |
|
Voltar ao Topo |
|
 |
casetek Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004 Mensagens: 211 Localização: Londrina - PR
|
Enviada: Qua Nov 21, 2007 1:54 pm Assunto: |
|
|
Olá Marcos,
Uma das maiores vantagens da O.O. é possibilitar exatamente isso que vc quer. Declare os atributos como privados e os métodos como públicos.
A definição de atributo privado é justamente essa, de só poder ser acessado dentro da própria classe.
TMyObject = class
private
Tipo:string[1];
CodMunic:string[5];
DataEnvio:string[8];
HoraEnvio:string[6];
Competencia:string[6];
Movimento:string[1];
CNPJ:string[14];
Origem:string[2];
Nome:string[55];
Departamento:string[55];
Cidade:string[30];
public
function SetNome (Nome:String):string;
function SetDepartamento (Depart:String):string;
function SetCidade (Cidade:String):string;
constructor Create;
end;
Uma observação. Métodos "SET" normalmente não retornam valor, por isso é melhor você usar uma procedure ao invés da function
procedure TMyObject.SetNome(nome: String);
begin
self.Nome:= nome;
end;
function TMyObject.GetNome(): String;
begin
Result:= Self.Nome;
end; |
|
Voltar ao Topo |
|
 |
marcosmodolo Aprendiz

Registrado: Quinta-Feira, 25 de Janeiro de 2007 Mensagens: 257
|
Enviada: Qua Nov 21, 2007 2:47 pm Assunto: |
|
|
Pois é eu fiz dessa forma... Dai quando vou utilizar veja so:
var
MyObject: TMyObject;
begin
MyObject:= TMyObject.Create;
MyObject.Cidade:= 'teste'; //O Delphi deixa eu fazer a atribuição direta!!!!
FreeAndNil(MyObject);
end; |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Qua Nov 21, 2007 3:12 pm Assunto: |
|
|
Every member of a class has an attribute called visibility, which is indicated by one of the reserved words private, protected, public, published, or automated. For example,
published property Color: TColor read GetColor write SetColor;
declares a published property called Color. Visibility determines where and how a member can be accessed, with private representing the least accessibility, protected representing an intermediate level of accessibility, and public, published, and automated representing the greatest accessibility.
Private, protected, and public members
Published members
Automated members
If a member's declaration appears without its own visibility specifier, the member has the same visibility as the one that precedes it. Members at the beginning of a class declaration that don't have a specified visibility are by default published, provided the class is compiled in the {$M+} state or is derived from a class compiled in the {$M+} state; otherwise, such members are public.
For readability, it is best to organize a class declaration by visibility, placing all the private members together, followed by all the protected members, and so forth. This way each visibility reserved word appears at most once and marks the beginning of a new "section" of the declaration. So a typical class declaration should like this:
type
TMyClass = class(TControl)
private
... { private declarations here}
protected
... { protected declarations here }
public
... { public declarations here }
published
... { published declarations here }
end;
You can increase the visibility of a member in a descendant class by redeclaring it, but you cannot decrease its visibility. For example, a protected property can be made public in a descendant, but not private. Moreover, published members cannot become public in a descendant class. For more information, see Property overrides and redeclarations.
---------------
Editado, não tem nada a ver com protected...
as classes se enxergam e tem acesso a todas as variaveis se estão na mesma unit... se vc colocar no uses e instanciar em outro lugar ai o private funciona... _________________ “The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Editado pela última vez por DonOctavioDelFlores em Qua Nov 21, 2007 3:55 pm, num total de 1 vez |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Qua Nov 21, 2007 3:19 pm Assunto: |
|
|
vc se deu ao trabalho de ao menos dar uma olhada numa unit qq do delphi?
forms, controls, etc.
Código: | TMyObject = class
private
Tipo: Char;
CodMunic:string[5];
DataEnvio:string[8];
HoraEnvio:string[6];
Competencia:string[6];
Movimento:string[1];
CNPJ:string[14];
Origem:string[2];
Nome:string[55];
Departamento:string[55];
Cidade:string[30];
procedure SetNome (Nome:String);
function GetNome :string;
procedure SetDepartamento (Depart:String);
function GetDepartamento :string;
procedure SetCidade (Cidade:String);
function GetCidade :string;
public
property Nome : string Read GetNome write SetNome;
property Departamento : string Read GetDepartamento write SetDepartamento;
property Cidade : string Read GetCidade write SetCidade;
constructor Create;
end; |
isso é o q chamam de encapsulamento. |
|
Voltar ao Topo |
|
 |
marcosmodolo Aprendiz

Registrado: Quinta-Feira, 25 de Janeiro de 2007 Mensagens: 257
|
Enviada: Qua Nov 21, 2007 4:50 pm Assunto: |
|
|
gilsonnrodrigues escreveu: | vc se deu ao trabalho de ao menos dar uma olhada numa unit qq do delphi?
forms, controls, etc.
Código: | TMyObject = class
private
Tipo: Char;
CodMunic:string[5];
DataEnvio:string[8];
HoraEnvio:string[6];
Competencia:string[6];
Movimento:string[1];
CNPJ:string[14];
Origem:string[2];
Nome:string[55];
Departamento:string[55];
Cidade:string[30];
procedure SetNome (Nome:String);
function GetNome :string;
procedure SetDepartamento (Depart:String);
function GetDepartamento :string;
procedure SetCidade (Cidade:String);
function GetCidade :string;
public
property Nome : string Read GetNome write SetNome;
property Departamento : string Read GetDepartamento write SetDepartamento;
property Cidade : string Read GetCidade write SetCidade;
constructor Create;
end; |
isso é o q chamam de encapsulamento. |
Pois eh, mas mesmo assim continuo conseguindo atribuir a variavel diretamente mesmo no private, protected... eu nao sei o que esta acontecendo, se eu nao estou entendendo com funciona, se o que eu quero tem condicoes de ser feito realmente... nao sei, so sei que com todas essas opcoes que foi colocado aqui eu testei aqui no delphi continuo conseguindo fazer isso:
var
MyObject: TMyObject;
begin
MyObject:= TMyObject.Create;
MyObject.Cidade:= 'teste'; //O Delphi deixa eu fazer a atribuição direta!!!!
FreeAndNil(MyObject);
end;
Coisa que eu nao gostaria, gostaria fosse atribuido um valor a variavel apenas atraves da procedure:
procedure SetCidade (Cidade:String); |
|
Voltar ao Topo |
|
 |
DonOctavioDelFlores Colaborador

Registrado: Quarta-Feira, 12 de Setembro de 2007 Mensagens: 2630 Localização: Pra lá de Bagda
|
Enviada: Qua Nov 21, 2007 4:55 pm Assunto: |
|
|
tente acessar de outra unit... ai vai funcionar... _________________ “The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart |
|
Voltar ao Topo |
|
 |
marcosmodolo Aprendiz

Registrado: Quinta-Feira, 25 de Janeiro de 2007 Mensagens: 257
|
Enviada: Qua Nov 21, 2007 5:06 pm Assunto: |
|
|
DonOctavioDelFlores escreveu: | tente acessar de outra unit... ai vai funcionar... |
hehehe... Bom eu disse na minha primeira postagem que eu estava comecando com orientacao a objeto ne... coisa de principiante mesmo, enchi o saco de todos hahaha O problema realmente era que eu estava fazendo os testes na mesma unit de criacao da classe. Quando eu testei de a partir de uma outra unit como o colega disse, as variaveis privadas nao apareceram mais!
Pessoal, valeu mesmo pela ajuda e desculpe pela ignorancia.
Abs
Marcos |
|
Voltar ao Topo |
|
 |
danielbuona Profissional


Registrado: Quinta-Feira, 30 de Junho de 2005 Mensagens: 576 Localização: São Paulo/SP
|
Enviada: Qua Nov 21, 2007 5:28 pm Assunto: |
|
|
Amigo, se eu fosse desenvolver, eu faria assim..
Código: |
unit Unit1;
interface
type
TMyObject = class
private
FCNPJ: string;
FCodMunic: string;
FDataEnvio: String;
FDepartamento: string;
FHoraEnvio: string;
FNome: string;
FCompetencia: string;
FCidade: string;
FTipo: string;
FOrigem: string;
FMovimento: string;
procedure SetCidade(const Value: string);
procedure SetCNPJ(const Value: string);
procedure SetCodMunic(const Value: string);
procedure SetCompetencia(const Value: string);
procedure SetDataEnvio(const Value: String);
procedure SetDepartamento(const Value: string);
procedure SetHoraEnvio(const Value: string);
procedure SetMovimento(const Value: string);
procedure SetNome(const Value: string);
procedure SetOrigem(const Value: string);
procedure SetTipo(const Value: string);
published
property Tipo:string read FTipo write SetTipo;
property CodMunic:string read FCodMunic write SetCodMunic;
property DataEnvio:String read FDataEnvio write SetDataEnvio;
property HoraEnvio:string read FHoraEnvio write SetHoraEnvio;
property Competencia:string read FCompetencia write SetCompetencia;
property Movimento:string read FMovimento write SetMovimento;
property CNPJ:string read FCNPJ write SetCNPJ;
property Origem:string read FOrigem write SetOrigem;
property Nome:string read FNome write SetNome;
property Departamento:string read FDepartamento write SetDepartamento;
property Cidade:string read FCidade write SetCidade;
end;
implementation
{ TMyObject }
procedure TMyObject.SetCidade(const Value: string);
begin
FCidade := Copy(Value,01,30);
end;
procedure TMyObject.SetCNPJ(const Value: string);
begin
FCNPJ := Copy(Value,01,14);
end;
procedure TMyObject.SetCodMunic(const Value: string);
begin
FCodMunic := Copy(Value,01,05);
end;
procedure TMyObject.SetCompetencia(const Value: string);
begin
FCompetencia := Copy(Value,01,06);
end;
procedure TMyObject.SetDataEnvio(const Value: String);
begin
FDataEnvio := Copy(Value,01,08);
end;
procedure TMyObject.SetDepartamento(const Value: string);
begin
FDepartamento := Copy(Value,01,55);
end;
procedure TMyObject.SetHoraEnvio(const Value: string);
begin
FHoraEnvio := Copy(Value,01,06);
end;
procedure TMyObject.SetMovimento(const Value: string);
begin
FMovimento := Copy(Value,01);
end;
procedure TMyObject.SetNome(const Value: string);
begin
FNome := Copy(Value,55);
end;
procedure TMyObject.SetOrigem(const Value: string);
begin
FOrigem := Copy(Value,01,02);
end;
procedure TMyObject.SetTipo(const Value: string);
begin
FTipo := Copy(Value,01,01);
end;
end.
|
e para usar
Código: |
procedure TForm1.Button1Click(Sender:TObject);
var
vMyObject: TMyObject;
begin
vMyObject := TMyObject.Create;
try
Form1.cdsTeste.Open;
vMyObject.Tipo := '1';
vMyObject.CodMunic := Form1.cdsteste.fieldbyname('CODSINPAS').AsString;
vMyObject.DataEnvio := FormatDateTime('yyyymmdd',Date);
vMyObject.HoraEnvio := StringReplace(TimeToStr(Time),':','',[rfReplaceAll]);
vMyObject.Competencia := FormatDateTime('yyyymm',Date);
vMyObject.Movimento := '1';
vMyObject.CNPJ := Form1.cdsTeste.fieldbyname('CNPJ').AsString;
vMyObject.Origem := '44';
vMyObject.Nome := Form1.cdsTeste.fieldbyname('TITULO').AsString;
vMyObject.Departamento := 'OBRAS E MEIO AMBIENTE';
vMyObject.Cidade := Form1.cdsTeste.fieldbyname('MUNICIPIO').AsString;
finally
FreeAndNil(vMyObject);
end;
end;
|
Observe que existe métodos que são chamados a cada atribuição (write SetDepartamento;)
Você pode definir a sua regra neles sem problema...
Pesquise nos sites de programação, artigos relacionados a criação de componentes... vai ti dar uma idéia sobre OO e como utiliza-la... |
|
Voltar ao Topo |
|
 |
marcosmodolo Aprendiz

Registrado: Quinta-Feira, 25 de Janeiro de 2007 Mensagens: 257
|
Enviada: Qua Nov 21, 2007 5:40 pm Assunto: |
|
|
Valeu pela dica!
Muito obrigado
Abs |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|