Em que ordem para definir getters e setters? [fechadas]

13

Existe uma prática recomendada para a ordem de definição de getters e setters? Parece haver duas práticas:

  • pares getter / setter
  • primeiros getters, depois setters (ou vice-versa)

Para esclarecer a diferença, aqui está um exemplo de Java de pares getter / setter:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

E aqui está um exemplo de Java de primeiros getters, depois setters:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Acho que o último tipo de pedido é mais claro nos diagramas de código e de classe, mas não sei se isso é suficiente para descartar o outro tipo de pedido.

NN
fonte

Respostas:

7

O primeiro caminho. Se possível, sempre agrupe ou mantenha-se próximo de funções relacionadas que operam nos mesmos membros.

Se você organizar seu código dessa maneira, fica mais claro e fácil refatorar, pois se uma classe pode ser fatorada em outra que está fazendo muito, a parte fatorável geralmente gira em torno de uma variável de membro específica.

Em geral, é mais fácil depurar, entender e manipular o código quando você pode ver tudo na mesma página durante todo o ciclo de vida de um objeto / variável. Eu diria que o layout do código baseado principalmente em superficialidades como escopo e ordem alfabética significa que você perde oportunidades de refatorar porque não pode vê-las.

Bento
fonte
Deseja incluir algum argumento adicional sobre por que as funções que operam nos mesmos membros devem ser mantidas juntas?
NN
Adicionado alguns motivos.
Benedict
25

Se você estiver em uma equipe, faça o que eles costumam fazer. Caso contrário, basta escolher o que você mais gosta. Na escala de opções importantes de design, isso provavelmente está próximo de "qual polegar devo usar para pressionar a barra de espaço?"

axblount
fonte
7
Concordo completamente. Isso vem sob o título "não se preocupe", que deve ser a regra padrão de codificação nº 0 de todos ( é a regra nº 0 em "C ++ Coding Standards", de Herb Sutter e Andre Alexandrescu.)
David Hammen,
Eu tenho certeza que as pessoas têm argumentado um monte sobre o qual polegar eles devem usar para bater a barra de espaço)))
SuperM
@ Michael Eu também sou um número certo. Tentei usar exclusivamente a minha esquerda, mas foi extremamente difícil e minha digitação diminuiu para um rastreamento.
fácil
@axblount Eu sou destro, mas sempre use meu polegar esquerdo. Apenas tentei o meu direito e tive a mesma experiência que você descreveu. Também digito "y" com a mão esquerda por algum motivo.
KChaloux #
6

Também pode depender do idioma. Em Java, não há nenhuma vantagem real para qualquer pedido, mas em C #, por exemplo, você tem o conceito de "propriedades", que agrupam o getter e o setter, de modo que isso impõe esse pedido. Em uma linguagem como C ++, em que você pode querer visibilidade diferente entre getters e setters (por exemplo, private setter, public getter), provavelmente faria o contrário, já que o modificador de visibilidade é fornecido uma vez para vários métodos, e não individualmente para cada .

Darrel Hoffman
fonte
4

Até onde eu sei, não existe uma única convenção. A seção Convenções de código do Oracle Java sobre organização de arquivos não menciona explicitamente o posicionamento de getters e setters, mas diz:

Esses métodos devem ser agrupados por funcionalidade e não por escopo ou acessibilidade.

Isso não fornece nenhuma orientação - eu poderia argumentar que qualquer canal atende a esse critério.

Algo a considerar é que os IDEs modernos permitem que você tenha visões mais abstratas da estrutura de seus arquivos do que como o componente de código textual. Juntamente com poderosas ferramentas de pesquisa, deve ser fácil navegar pelos arquivos e encontrar os métodos apropriados em arquivos grandes.

Como exemplo, o Eclipse fornece uma visualização de estrutura de tópicos que permite classificar e filtrar métodos e campos de maneiras diferentes e navegar até onde eles estão nos arquivos. O NetBeans tinha funcionalidade semelhante, e eu suspeito que a maioria dos outros IDEs também.

A única vez que isso pode importar é se você estiver lendo o código fora do seu IDE. Um exemplo pode estar usando uma ferramenta de revisão de código externa ou visualizando deltas do seu sistema de controle de versão.

A melhor solução seria simplesmente ser consistente entre os arquivos em um projeto. Encontre um padrão, documente-o e cumpra-o.

Thomas Owens
fonte
1

Agrupe o getter e o setter para um único campo juntos, em pares.

O agrupamento de todos os getters e todos os setters torna difícil dizer quais campos têm apenas getters ou apenas setters.

Quando estou lendo um código ou procurando uma funcionalidade específica, imagino uma classe como tendo campos, com cada campo tendo um getter e um setter. Não faz sentido para mim que uma classe tenha um grupo getters e um grupo setters, cada um com campos.

M. Dudley
fonte
Então, você argumenta que os getters para um campo devem ser emparelhados com os getters para esse campo, porque facilita a visão geral de como são tratados certos campos em uma classe?
NN
Isso e o modelo conceitual do que é uma classe. As aulas devem ser organizadas principalmente por funcionalidade. Ao criar uma classe, você pode decidir que ela precisa de um campo mutável, visível ao público. Essa é a "funcionalidade" conceitual, não a expressão sintática através dos métodos getter e setter.
M. Dudley
0

Já o Java IDE pode gerar getters e setters para você. Basta usar essa funcionalidade e deixar a ordem desses métodos, como o IDE a criou. Este é um código gerado, não o toque desnecessariamente.

user281377
fonte
Estou ciente disso. No entanto, por exemplo, no Eclipse, você pode escolher entre diferentes pedidos .
NN
Certo. A opção padrão "Campos em pares getter / setter" parece mais útil, porque você pode adicionar mais campos e gerar mais acessadores posteriormente, sem ter que se preocupar com o método que vai aonde, basta colocar os dois no final.
precisa saber é o seguinte