INICIANTE OOP

ADHEL 31/07/2013 09:57:58
#426745
Tenho visto aqui e lido em vários lugares sobre OOP.
Em todos os lugares dizem :
- Vantagens são inúmeras.
Ok , acredito.
Só que entender o conceito e colocar na prática inicialmente é difícil.
Me vejam como uma criança(criança = criança de antigamente,que o passatempo era brincar de bolinha,pião e jogar bola, do tempo em que a tv era preto e branco) que vai ao primeiro dia de aula e a professora coloca na lousa impiedosamente as vogais.
Por mais simples que possa parecer,para a criança é complicado.
é aí que me encontro nesse campo chamado OOP.
Classes, herança,polimorfismo,abstração,interfaces,entidades para quem brinca/tenta com paradigma procedural é duro.
Então de tanto ler sobre OOP,resolvi tentar aprender.
Para aprender, só praticando.
Então o meu pontapé inicial é gravar na tabela funcionários.
Criei uma classe Pessoa com as propriedades (Id,Nome,Cidade).
Criei uma classe Funcionario com as propriedades (Cpf,Cargo,Salario).
Criei uma classe Conexao.
Criei uma classe LimparControles.
As dúvidas iniciais.
Isso que fiz pode ser considerado OOP ?
Qual seria o próximo passo ? (Se a resposta da primeira questão for positiva)
Obrigado a todos desde já.

Eis as classes

Citação:

Imports MySql.Data.MySqlClient
Public Class Conexao

Public cnn As MySqlConnection
Public cmd As MySqlCommand
Public Sub conOpen()
cnn = New MySqlConnection([Ô]server=localhost;userid=root;database=empresa;password=mbr2907X;port=3306[Ô])
cnn.Open()
End Sub
Public Sub conClose()
cnn.Close()
cnn.Dispose()
End Sub
End Class



Citação:

Imports MySql.Data.MySqlClient
Public Class Funcionario
Inherits Pessoa

Private _cpf As String
Private _cargo As String
Private _salario As Double
Public Property Cpf() As String
Get
Return _cpf
End Get
Set(value As String)
_cpf = value
End Set
End Property
Public Property Cargo() As String
Get
Return _cargo
End Get
Set(value As String)
_cargo = value
End Set
End Property
Public Property Salario() As Double
Get
Return _salario
End Get
Set(value As Double)
_salario = value
End Set
End Property
Public Sub gravarFuncionario(ByVal Nome As String, ByVal Cidade As String, ByVal Cpf As String, ByVal Cargo As String, ByVal Salario As Double)
Dim c As New Conexao
Try
c.conOpen()
Dim sql As String = [Ô]insert into funcionarios(nome,cpf,cidade,cargo,salario)values(@nome,@cpf,@cidade,@cargo,@salario)[Ô]
c.cmd = New MySqlCommand(sql, c.cnn)
With c.cmd
.Parameters.AddWithValue([Ô]@nome[Ô], Nome)
.Parameters.AddWithValue([Ô]@cpf[Ô], Cpf)
.Parameters.AddWithValue([Ô]@cidade[Ô], Cidade)
.Parameters.AddWithValue([Ô]@cargo[Ô], Cargo)
.Parameters.AddWithValue([Ô]@salario[Ô], Salario)
.ExecuteNonQuery()
End With
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
c.conClose()
End Try
End Sub
End Class



Citação:

Public Class Pessoa

#Region [Ô]variaveis[Ô]
Private _id As Integer
Private _nome As Integer
Private _cidade As Integer
#End Region

#Region [Ô]propriedades[Ô]
Public Property ID() As Integer
Get
Return _id
End Get
Set(value As Integer)
_id = value
End Set
End Property
Public Property Nome() As String
Get
Return _nome
End Get
Set(value As String)
_nome = value
End Set
End Property
Public Property Cidade() As String
Get
Return _cidade
End Get
Set(value As String)
_cidade = value
End Set
End Property


#End Region

End Class



E no formulário
Citação:

Public Class Form1
Dim f As New Funcionario
Dim l As New LimparControles
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
f.gravarFuncionario(txtNome.Text, txtCpf.Text, txtCidade.Text, txtCargo.Text, txtSalario.Text)
l.Limpar(Me)
End Sub
End Class

KERPLUNK 31/07/2013 10:13:09
#426747
Resposta escolhida
Está bem parecido, na verdade já está no princípio correto, parabéns! O meu único porém é o método de gravação. Você não precisa passar os parâmetros para ele. Basta usar as variáveis que já estão na classe, ficaria algo como:

Public Sub gravarFuncionario()
Dim c As New Conexao
Try
c.conOpen()
Dim sql As String = [Ô]insert into funcionarios(nome,cpf,cidade,cargo,salario)values(@nome,@cpf,@cidade,@cargo,@salario)[Ô]
c.cmd = New MySqlCommand(sql, c.cnn)
With c.cmd
.Parameters.AddWithValue([Ô]@nome[Ô], _nome)
.Parameters.AddWithValue([Ô]@cpf[Ô], _cpf)
.Parameters.AddWithValue([Ô]@cidade[Ô], _cidade)
.Parameters.AddWithValue([Ô]@cargo[Ô], _cargo)
.Parameters.AddWithValue([Ô]@salario[Ô], _salario)
.ExecuteNonQuery()
End With
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
c.conClose()
End Try
End Sub


E no seu form:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim func As New Funcionario
func.Nome = txtNome.Text
func.Cpf = txtCPF.Text
......
func.gravarFuncionario()
l.Limpar(Me)
End Sub


Mas realmente, parabéns pela iniciativa e pelo esforço!
NILSONTRES 31/07/2013 10:26:02
#426749
A Maior dificuldade em aceitar OOP, é que agente tenta achar diferença em usar procedures e oop, e não encontra muita, sendo que as procedures, são até mais faceis de se entender, levando em conta o costume antigo. Aos poucos agente vai descobrindo essa vantagem de utilizar OOP.

ADHEL 31/07/2013 11:05:00
#426755
Kerplunk
Tive que mudar as variáveis _nome e _cidade de private para public na classe Pessoa para ficar acessível nessa parte :
    Public Sub gravarFuncionario()
Dim c As New Conexao
Try
c.conOpen()
Dim sql As String = [Ô]insert into funcionarios(nome,cpf,cidade,cargo,salario)values(@nome,@cpf,@cidade,@cargo,@salario)[Ô]
c.cmd = New MySqlCommand(sql, c.cnn)
With c.cmd
.Parameters.AddWithValue([Ô]@nome[Ô], _nome)
.Parameters.AddWithValue([Ô]@cpf[Ô], _cpf)
.Parameters.AddWithValue([Ô]@cidade[Ô], _cidade)
.Parameters.AddWithValue([Ô]@cargo[Ô], _cargo)
.Parameters.AddWithValue([Ô]@salario[Ô], _salario)
.ExecuteNonQuery()
End With
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
c.conClose()
End Try
End Sub


O que me intrigou foi que não precisei usar o Replace para fazer a gravação do campo salário, que na tabela está como double.
Gravou normalmente.Sabe falar o porquê disso?

Nilson
Acredito que seja por aí, como você comentou.Como não sei absolutamente nada ainda, não consigo enxergar o que já está claro para o pessoal.
até mais.
EDUFS 31/07/2013 13:43:39
#426773
ADHEL, estou exatamente como você, comecei com o velho clipper e hoje estou com o VB6.

Minhas dificuldades são muito parecidas com as suas.

Irei começar meu [Ô]estudo[Ô], para futura migração para OOP. (sei que estou muito atrasado).

Parabéns pela iniciativa.
ADHEL 31/07/2013 14:10:21
#426778
Citação:

:
ADHEL, estou exatamente como você, comecei com o velho clipper e hoje estou com o VB6.

Minhas dificuldades são muito parecidas com as suas.

Irei começar meu [Ô]estudo[Ô], para futura migração para OOP. (sei que estou muito atrasado).

Parabéns pela iniciativa.



Obrigado EDUFS.
Com tanta gente capaz recomendando oop,não se pode ignorar.
KERPLUNK 31/07/2013 14:32:40
#426780
A sub [Ô]gravarFuncionario[Ô], ficaria dentro da classe [Ô]Funcionario[Ô], assim não precisaria tornar as variáveis internas, públicas.
ADHEL 31/07/2013 14:56:16
#426787
Citação:

:
A sub [Ô]gravarFuncionario[Ô], ficaria dentro da classe [Ô]Funcionario[Ô], assim não precisaria tornar as variáveis internas, públicas.




A sub gravaFuncionario está dentro da classe Funcionario,essas variáveis que mudei eu herdei da classe Pessoa.
Quando muda para private veja a imagem

Veja a classe Funcionario
  Imports MySql.Data.MySqlClient
Public Class Funcionario
Inherits Pessoa
Dim c As New Conexao
Private _cpf As String
Private _cargo As String
Private _salario As Double
Public Property Cpf() As String
Get
Return _cpf
End Get
Set(value As String)
_cpf = value
End Set
End Property
Public Property Cargo() As String
Get
Return _cargo
End Get
Set(value As String)
_cargo = value
End Set
End Property
Public Property Salario() As Double
Get
Return _salario
End Get
Set(value As Double)
_salario = value
End Set
End Property
Public Sub gravarFuncionario()

Try
c.conOpen()
Dim sql As String = [Ô]insert into funcionarios(nome,cpf,cidade,cargo,salario)values(@nome,@cpf,@cidade,@cargo,@salario)[Ô]
c.cmd = New MySqlCommand(sql, c.cnn)
With c.cmd
.Parameters.AddWithValue([Ô]@nome[Ô], _nome)
.Parameters.AddWithValue([Ô]@cpf[Ô], _cpf)
.Parameters.AddWithValue([Ô]@cidade[Ô], _cidade)
.Parameters.AddWithValue([Ô]@cargo[Ô], _cargo)
.Parameters.AddWithValue([Ô]@salario[Ô], _salario)
.ExecuteNonQuery()
End With
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
c.conClose()
End Try
End Sub

End Class



KERPLUNK 31/07/2013 15:00:38
#426788
Se o capo [Ô]Cidade[Ô] está na tabela de funcionário, ele deve ser parte(propriedade) da classe Funcionario. Mas acho que entendi o que você quer fazer. O caso é que você quer implementar os dados de [Ô]Pessoa[Ô] em [Ô]Funcionario[Ô]. Nesse caso, [Ô]Pessoa[Ô] deveria ser uma Interface, que você implementaria na classe [Ô]Funcionario[Ô], o que você quer fazer é Interfaceamento e não herança...
ADHEL 31/07/2013 15:12:47
#426789
Então eu sou obrigado a colocar na classe funcionario as variáveis _nome e _cidade e suas propriedades?

KERPLUNK 31/07/2013 15:37:30
#426792
Sim e não... O que você quer fazer é uma padronização, pelo que entendi. Você quer que outras classes que tenham dados de Pessoa(como Funcionario), automaticamente tenham, além das propriedades de Funcionario, também as propriedades de Pessoa. é isso que você quer?
Página 1 de 3 [21 registro(s)]
Tópico encerrado , respostas não são mais permitidas