Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Caros,
Gostaria de esclarecer uma dúvida, por que preciso instanciar uma classe na mesma para acessar o método/função? Qual seria o motivo( Segurança, organização, desempenho ou outros) ?
Eu entendo que poderia usar o método como estático.
Na programação estruturada isso não seria necessário.
Obs.: Mesmo o método estando com sua visibilidade public [...]
Agradeço antecipadamente,
André Vieira.
>
Pelo visto, você (ainda) não pegou o conceito de orientação a objetos.
A ideia da OOP é permitir um nível alto de abstração e reutilização, enquanto a da programação procedural é ter um bloco monolítico de código que roda linha por linha diretamente (procedimentos). Um boa forma de conseguir absorver o conceito é esquecer programação procedural porque se você pensar em procedimentos exatos em OOP o resultado é um mau código e pouco reutilizável.
O grande ponto de haver objetos é que existe algo chamado estado, que não recebe muita atenção em programação procedural, já que ele é sempre representado com variáveis. Pense no estado como os dados que você precisa (qual é o nome do usuário, se o usuário está ativo ou não, etc.) e o comportamento como as operações do sistema (salvar algo no banco de dados, abrir um arquivo, imprimir algo na tela, etc.).
Em orientação a objetos, há uma estrutura:
-
protótipos: na maioria das linguagens (PHP, Java, C#) os protótipos são feitos através de classes, mas há também outras linguagens onde usamos prototype (JavaScript, Lua, Self) e algumas suportam ambos, como Ruby. O conceito de protótipos é criar um modelo para seus objetos, que são basicamente constituídos de métodos (comportamento) e propriedades (estado).
-
objetos: um protótipo é apenas um modelo, logo nós precisamos de algo concreto. Para isso, há objetos, que são os valores que você recebe após instanciar os protótipos. Cada objeto tem um estado diferente do outro, é exatamente isso o porquê de você ter que instanciar um protótipo para poder usá-lo. Um objeto tem acesso às propriedades e aos métodos públicos definidos no protótipo (vale lembrar que algumas linguagens não têm visibilidade, fazendo com que tudo seja acessível).
Estáticos são perigosos e provavelmente uma das maiores barreiras para quem está aprendendo OOP. Nesse post eu mostrei os três principais propósitos dos métodos estáticos.
Em resumo, como você está começando, esqueça os estáticos para não criar uma confusão.
Visibilidade não tem nada a ver com necessitar de instância ou não. O propósito da visibilidade é controlar quem pode e quem não pode acessar métodos e propriedades:
-
public: todo mundo pode acessar (classe, classe filha* e objeto) => API pública
-
protected: a classe e a classe filha* podem acessar, mas os objetos não
-
private: somente a classe pode acessar
*Classes filhas são classes que herdam de alguma outra.
Sinto honrado com sua resposta, respondeu perfeitamente.
Já tinha entendido esse conceito para classes diferentes e pensei que para mesma classe não teria esse comportamento.
Seria uma má programação instanciar a classe na mesma?
Por exemplo:
Eu tenho o método getBodyFatPer() // Pega o percentual da gordura corporal.
Eu preciso utilizar ele na mesma classe, dentro do método addEvaluation();
// Aqui surgiu a dúvida.
O que você acha?
Agradeço antecipadamente,
André Vieira.
Aí nós entramos em uma questão de OOP: acoplamento.
Um conceito bem difundido é Dependency Injection, onde você passa as classes por parâmetros.
Pelo visto, você (ainda) não pegou o conceito de orientação a objetos.
A ideia da OOP é permitir um nível alto de abstração e reutilização, enquanto a da programação procedural é ter um bloco monolítico de código que roda linha por linha diretamente (procedimentos). Um boa forma de conseguir absorver o conceito é esquecer programação procedural porque se você pensar em procedimentos exatos em OOP o resultado é um mau código e pouco reutilizável.
O grande ponto de haver objetos é que existe algo chamado estado, que não recebe muita atenção em programação procedural, já que ele é sempre representado com variáveis. Pense no estado como os dados que você precisa (qual é o nome do usuário, se o usuário está ativo ou não, etc.) e o comportamento como as operações do sistema (salvar algo no banco de dados, abrir um arquivo, imprimir algo na tela, etc.).
Em orientação a objetos, há uma estrutura:
-
protótipos: na maioria das linguagens (PHP, Java, C#) os protótipos são feitos através de classes, mas há também outras linguagens onde usamos prototype (JavaScript, Lua, Self) e algumas suportam ambos, como Ruby. O conceito de protótipos é criar um modelo para seus objetos, que são basicamente constituídos de métodos (comportamento) e propriedades (estado).
-
objetos: um protótipo é apenas um modelo, logo nós precisamos de algo concreto. Para isso, há objetos, que são os valores que você recebe após instanciar os protótipos. Cada objeto tem um estado diferente do outro, é exatamente isso o porquê de você ter que instanciar um protótipo para poder usá-lo. Um objeto tem acesso às propriedades e aos métodos públicos definidos no protótipo (vale lembrar que algumas linguagens não têm visibilidade, fazendo com que tudo seja acessível).
Estáticos são perigosos e provavelmente uma das maiores barreiras para quem está aprendendo OOP. Nesse post eu mostrei os três principais propósitos dos métodos estáticos.
Em resumo, como você está começando, esqueça os estáticos para não criar uma confusão.
Visibilidade não tem nada a ver com necessitar de instância ou não. O propósito da visibilidade é controlar quem pode e quem não pode acessar métodos e propriedades:
-
public: todo mundo pode acessar (classe, classe filha* e objeto) => API pública
-
protected: a classe e a classe filha* podem acessar, mas os objetos não
-
private: somente a classe pode acessar
*Classes filhas são classes que herdam de alguma outra.