web-dev-qa-db-ja.com

長い変数名をどうするか?

最初の例:

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

これらの名前は大きすぎますか?他にどのようにこれらの関数を呼び出しますか?

私はパラメーターについて考えていましたが、Martin Fowlerによると、関数でパラメーターを使用しない方が良いとのことです。

2番目の例:

クラスでこれらの2つの変数を使用する必要があります。

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() {}
}

ここで私はパラメータを使用できなくなります。

6
paulbooker

コードレイアウトスタイルの問題が名前を短くする動機にならないようにしてください。

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() {}
}

ただし、常に迅速かつ効果的にポイントを取得するようにしてください。無意味な綿毛を許可しないでください。

考慮してください:

asianContriesWithMostPlanesAndBoats
africanCountriesWithMostCars

また、「国を比較する」責任を持つクラスがアジアとアフリカだけを扱っているのも驚くべきことです。クラス名はもっと長くする必要があるかもしれません。中を見ても驚かないでください。

11
candied_orange

本当にパラメータを使いたくない場合は、分割統治法(別名SRP)を使用してください。 1つの長い通話を複数に分割します。

getCountries()
  .fromAsia()
  .planesAndBoats()

このスタイルは、「流暢なインターフェース」と呼ばれることがよくあります。

12
user949300

個人的には、長い変数名でも大丈夫ですが、私なら、おそらくcountriesFromAsiaWhereAreTheMostPlanesAndBoatsのようにtopCountriesByAirSeaのような名前を付けます。

ただし、コンストラクタが2つの国のリストを受け取っている場合、それらのリストに含まれている内容はこのクラスには関係ありません。そして、それが関連している場合、それはおそらく設計上の欠陥です。

この場合は、sourceCountriestargetCountriesのような名前を付けます。

2
John MacIntyre

長い変数名でもかまいませんが、この例では、より大きな問題が原因のようです。

南アメリカ、ヨーロッパ、太平洋が追加された場合はどうなりますか?これらのそれぞれに新しい方法はありますか?さらに多くの種類の車両が追加された場合はどうなりますか?国ごとに新しい方法が必要です。 特定のインスタンスごとに新しいメソッドを作成する代わりに、リポジトリでデータをフィルターする方法を提供することをお勧めします。

C#では、Linqを使用できます。私はJavaに不慣れですが、おそらくこのような拡張機能を作成できます。 Pythonでは、リスト内包表記を使用できます。

自動車/ボート/飛行機の構成要素を「最も」構成している変数を、現在は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);

またはトップ10に

countryRepository.getCountries()
   .Where(c => c.Region == "Africa")
   .OrderByDescending(c => c.NumberCars)
   .Take(10)
   .Select(c => c.Name);
1
Chris Cerk

長い変数名をバイパスして、新しいクラスの名前に意味を加えることができます。

最初の例では、AsiaCountryRepositoryとAfricaCountryRepositoryの異なるリポジトリを作成できます。

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

2番目の例では、CompareCountriesクラスのみを使用する代わりに、CompareAsiaCountriesおよびCompareAfricaCountriesを作成します。

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

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

}

私はそれがすべてのケースに適用できるわけではなく、いくつかのリファクタリングが必要であることを知っていますが、時々これは良い解決策です。

もっと一例

パッケージ名を使用して、クラスと内部の変数の実際の責任に関する詳細情報を追加することもできます。

アジアからの外国人である人からクレジットを計算すると想像してください。代わりに次のようなものを持っています:

import com.application;
com.application.CalculationService {

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

}

(私の最後の例のように)意味のある名前のクラスを持つことができます:

import com.application;
CalculationCreditForeignAsiaService {

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

}

または、多くの意味を持つニースパッケージのクラスを持つことができます。

import com.application.credit.foreigner.asia;
CalculateService() {
    public BigDecimal calculate(){
        BigDecimal value = result()
    }
}
0
Dherik