O que fazer com nomes longos de variáveis?

4

Primeiro exemplo:

countryRepository.getCountriesFromAsiaWhereAreTheMostPlanesAndBoats();
countryRepository.getCountriesFromAfricaWhereAreTheMostCars();

Esses nomes são grandes demais? De que outra forma nós chamamos essas funções?

Eu estava pensando em parâmetros, mas, de acordo com Martin Fowler, é melhor não usar parâmetros em funções.

Segundo exemplo:

Eu tenho que usar essas duas variáveis na classe:

public static class CompareCountries {     
    public String[] countriesFromAsiaWhereAreTheMostPlanesAndBoats;
    public String[] countriesFromAfricaWhereAreTheMostCars;

    public CompareCountries (String countriesFromAsiaWhereAreTheMostPlanesAndBoats, String[] countriesFromAfricaWhereAreTheMostCars){
        this.countriesFromAsiaWhereAreTheMostPlanesAndBoats = countriesFromAsiaWhereAreTheMostPlanesAndBoats;
        this.countriesFromAfricaWhereAreTheMostCars = countriesFromAfricaWhereAreTheMostCars;
    }   

    public static String[] compares() {}
}

Aqui, mais eu não consigo usar parâmetros.

    
por paulbooker 03.03.2018 / 16:08
fonte

5 respostas

10

Nunca deixe um problema de estilo de layout de código motivar você a encurtar um nome:

public static class CompareCountries {     
    public String[] countriesFromAsiaWhereAreTheMostPlanesAndBoats;
    public String[] countriesFromAfricaWhereAreTheMostCars;

    public CompareCountries (
            String countriesFromAsiaWhereAreTheMostPlanesAndBoats, 
            String[] countriesFromAfricaWhereAreTheMostCars
    ) {
        this.countriesFromAsiaWhereAreTheMostPlanesAndBoats =
            countriesFromAsiaWhereAreTheMostPlanesAndBoats
        ;

        this.countriesFromAfricaWhereAreTheMostCars = 
            countriesFromAfricaWhereAreTheMostCars
        ;
    }   

    public static String[] compares() {}
}

No entanto, sempre tente entender o ponto de forma rápida e eficaz. Nunca permita cotão inútil.

Considere:

asianContriesWithMostPlanesAndBoats
africanCountriesWithMostCars

Além disso, acho surpreendente que uma classe cuja responsabilidade é "comparar países" lide apenas com a Ásia e a África. O nome da classe pode precisar ser maior. Eu não deveria me surpreender quando olho para dentro.

    
por 03.03.2018 / 16:35
fonte
8

Se você realmente não quiser usar parâmetros, use dividir e conquistar, por exemplo, SRP. Divida sua longa chamada em vários, por exemplo,

getCountries()
  .fromAsia()
  .planesAndBoats()

Esse estilo é geralmente chamado de "interface fluente".

    
por 03.03.2018 / 17:48
fonte
1

Pessoalmente, estou bem com nomes longos de variáveis, mas se fosse eu, provavelmente nomearia countriesFromAsiaWhereAreTheMostPlanesAndBoats algo como topCountriesByAirSea .

No entanto, tendo dito isto, se o construtor está recebendo duas listas de países, então o que essas listas contêm não é relevante para esta classe! E se for relevante, é provavelmente uma falha de design.

Se este for o caso, eu provavelmente nomearia algo como sourceCountries e targetCountries .

    
por 10.03.2018 / 21:12
fonte
0

Os nomes das variáveis longas são bons, mas no seu exemplo parece ser devido a um problema maior.

E se a América do Sul, a Europa e o Pacífico forem adicionados? Haverá novos métodos para cada um deles? E se ainda mais tipos de veículos forem adicionados? Para cada país, você precisaria de um novo método. Uma maneira melhor de fazer isso seria fornecer uma maneira de filtrar seus dados no repositório, em vez de criar um novo método para cada instância específica.

Em C # você pode usar o Linq. Eu não estou familiarizado com o Java, mas talvez você possa criar extensões como essas. Em Python, você pode usar as compreensões de lista.

Poderia submarcar uma variável que constituísse "a maioria" para carros / barcos / aviões, por enquanto 100:

countryRepository.getCountries()
   .Where(c => c.Region == "Asia")
   .Where(c => c.NumberPlanes > 100 && c.NumberBoats > 100)
   .Select(c => c.Name);

countryRepository.getCountries()
   .Where(c => c.Region == "Africa")
   .Where(c => c.NumberCars > 100)
   .Select(c => c.Name);

Ou escolha os 10 primeiros

countryRepository.getCountries()
   .Where(c => c.Region == "Africa")
   .OrderByDescending(c => c.NumberCars)
   .Take(10)
   .Select(c => c.Name);
    
por 14.03.2018 / 20:37
fonte
0

Você pode ignorar os nomes das variáveis longas, adicionando mais significado ao nome de uma nova classe.

No primeiro exemplo, você pode criar Repositórios diferentes: AsiaCountryRepository e AfricaCountryRepository:

asiaCountryRepository.getWhereAreTheMostPlanesAndBoats();
africaCountryRepository.getWhereAreTheMostCars();

No segundo exemplo, em vez de usar somente uma classe CompareCountries , crie um CompareAsiaCountries e CompareAfricaCountries :

public static class CompareCountries {     
    public CompareAsiaCountries whereAreTheMostPlanesAndBoats;
    public CompareAfricaCountries whereAreTheMostCars;

    public CompareCountries (CompareAsiaCountries whereAreTheMostPlanesAndBoats, CompareAfricaCountries whereAreTheMostCars){
        this.whereAreTheMostPlanesAndBoats= whereAreTheMostPlanesAndBoats;
        this.whereAreTheMostCars= whereAreTheMostCars;
    }   

}

Eu sei que isso pode não ser aplicável a todos os casos e precisa de algum refatoramento, mas às vezes essa é uma boa solução.

Mais um exemplo

Você também pode usar o nome do pacote para adicionar mais informações sobre as responsabilidades reais da classe e da variável.

Imagine que você calcula um crédito de uma pessoa que é estrangeira da Ásia. Em vez de ter algo como:

import com.application;
com.application.CalculationService {

    public BigDecimal calculate(){
        BigDecimal valueCeditOfForeignerFromAsia = result()
    }

}

Você pode ter uma turma com um nome significativo (como meu último exemplo):

import com.application;
CalculationCreditForeignAsiaService {

    public BigDecimal calculate(){
        BigDecimal value = result();
    }

}

Ou você pode ter uma aula em um pacote interessante com muito significado:

import com.application.credit.foreigner.asia;
CalculateService() {
    public BigDecimal calculate(){
        BigDecimal value = result()
    }
}
    
por 14.03.2018 / 21:01
fonte