Як справіцца з празмернымі аргументамі ў канструктарах?

Я знаходжуся ў працэсе стварэння прыкладання, якое прызначаецца, каб быць асабістым хатнім жывёлам праектам шахты, спраектаваныя вакол параўнання двух транспартных сродкаў супраць 1 іншых з кампутарнай гульні я гуляю транспартныя сродкі маюць кучу статыстыкі, такія як хуткасць, healthpoints, турэль абыход і г.д., і я хачу стварыць невялікае дадатак, якое будзе вылучыць адрозненні паміж транспартнымі сродкамі, аднак я прыйшоў да каменя перапоны, дзе аргументы, прынятымі для канструктараў для кожны транспартныя сродкі вялізныя й цяжка чытаць

Ніжэй прыведзены прыклад стварэння аб'екта з дадзеным канструктарам:

<�Код> HeavyTank T110E5 = новы HeavyTank ( "T110E5", 2200,54.56d, 875, 37, 30, 254,76,38, 203,127,70,300, 202, 6,32, 400,745,10);

Я ўпэўнены, вы б здагадацца, што гэта дадатак я раблю, гэта танк Comparer на аснове ад Свет танкаў, дзе я цяжка кадавання статыстыку танкавыя, але як вы можаце бачыць, аргументы, узятыя цяжка чытаць, што абцяжарвае ствараць новыя аб'екты, якія не блытаючыся. Кожны танк мае розныя артыкулы так што гэта азначае, што я павінен быў бы жорсткім код блізка да 100+ танкаў паасобку. Калі хтосьці тут мае рашэнне памяншэння бязладзіцы, або рэкамендацыі, я гатовы слухаць.

Я таксама хацеў бы, каб аднавіць кропку, я зрабіў на вяршыні, гэта дадатак не для камерцыйных мэт і з'яўляецца чыста толькі жывёлам асабістага праектам шахты.

0
@Dukeling Гэта залежыць ад таго, колькі патрабуецца, і неабавязковыя аргументы, у вас ёсць. Калі ў вас ёсць невялікая колькасць неабходных аргументаў, і вялікая колькасць дадатковых адзінак з разумнымі значэннямі па змаўчанні, вы можаце выкарыстоўваць Builder шаблон.
дададзена аўтар Vivin Paliath, крыніца
Паспрабуйце выканаць некаторыя заканамернасці і зрабіць код больш модульным.
дададзена аўтар Sednus, крыніца
stackoverflow.com/questions/328496/& hellip; Дык гэта будзе выглядаць наступным чынам :. HeavyTank T110E5 = новы HeavyTank.builder ( "T110E5") вышыня (2200) .Weight (875) .operato & ZWNJ; RS (4) .... пабудаваць ();
дададзена аўтар assylias, крыніца
@Dukeling Ваш будаваць метад можа праверыць, што абавязковыя аргументы былі ўсталяваныя.
дададзена аўтар assylias, крыніца
@Dukeling Усе публічныя параметры часу кампіляцыі з'яўляюцца схільныя памылак. Java не мае схемы дадзеных DSL, якая ў значнай ступені адзіны спосаб атрымаць час кампіляцыі бяспекі ў гэтым маштабе складанасці дадзеных.
дададзена аўтар Marko Topolnik, крыніца
Мая прапанова - паставіць аргументы ў базе дадзеных (мяркуецца, што вы на самой справе ёсць і іншыя рэчы, якія абгрунтоўваюць б выкарыстоўваць базу дадзеных, у адваротным выпадку змясціць іх у файл).
дададзена аўтар Dukeling, крыніца
@assylias Ці не будзе мець неверагодна высокую верагоднасць пропуску аргументаў? Ці ёсць нейкі спосаб, каб прадухіліць гэта, акрамя наяўнасці праверкі на Null або 0 ((1) з'яўляецца асяроддзе, а не падчас кампіляцыі і (2) не абавязкова будзе працаваць, так як яны могуць быць сапраўдны) ва ўсім свеце?
дададзена аўтар Dukeling, крыніца
@assylias Проста таму, што гэта неабавязкова, не азначае, што не павінна быць там для гэтага канкрэтнага пункта. Ва ўсякім выпадку, проста адчувае сябе схільныя памылкі мне.
дададзена аўтар Dukeling, крыніца

9 адказы

Я хацеў бы прапанаваць захоўваць вашыя дадзеныя танкавыя ў простым фармаце файла, напрыклад CSV-файл з адным радком у бак. Тады ваш аб'ект танк можа ўзяць нешта накшталт InputStream у якасці параметру і патоку ў дэталях танкавыя з файла.

А калі вы карыстаецеся файл CSV, вы можаце проста выкарыстоўваць тыповую праграму працы з электроннымі табліцамі, каб змяніць дадзеныя танкавую даволі лёгка.

3
дададзена

Гэта гучыць як ідэальны варыянт выкарыстання для будаўнік шаблон .

Ёсць шмат добрыя прыклады аб тым, як ажыццявіць гэта. Вось як Google выкарыстоўвае яго ў метад фарміравання ланцужкі , але гэта менш важна. Галоўнай асаблівасцю з'яўляецца тое, што newBuilder() ўсталёўвае некаторыя параметры па змаўчанні, якія вы можаце затым выбарачна Adjust з адным ці некалькімі выклікамі метадаў. Нарэшце, вы выклікаеце пабудаваць() на самой справе стварыць асобнік (і выклікаць фактычны канструктар з доўгім спісам параметраў).

2
дададзена
дзякуй, шаблон будаўнік здаецца карысным. Мне таксама спадабалася ідэя CSV файл, згаданы Джэймсам Holderness. Гэта мела б сэнс стварыць базу дадзеных для дадзеных тыпаў, якія могуць быць лёгка змененыя, калі гульня кампанія змяняе статыстыку танкаў, але шаблон будаўнік з'яўляецца яшчэ адным выдатным рашэннем.
дададзена аўтар tommy knocker, крыніца

Калі ў вас ёсць спалучэнне абавязковых і неабавязковых аргументаў (з прымальнымі значэннямі па змаўчанні), вы можаце выкарыстоўваць шаблон будаўнік. Прыклад з Effective Java:

public class NutritionalFacts {
    private int sodium;
    private int fat;
    private int carbo;

    public static class Builder {
        private int sodium;
        private int fat;
        private int carbo;

        public Builder(int s) {
            this.sodium = s;
        }

        public Builder fat(int f) {
            this.fat = f;
            return this;
        }

        public Builder carbo(int c) {
            this.carbo = c;
            return this;
        }

        public NutritionalFacts build() {
            return new NutritionalFacts(this);
        }
    }

    private NutritionalFacts(Builder b) {
        this.sodium = b.sodium;
        this.fat = b.fat;
        this.carbo = b.carbo;
    }
}

Пасля гэтага вы можаце рабіць такія рэчы, як:

NutritionFacts cocaCola =  new NutritionFacts.Builder(240, 8). calories(100).sodium(35).carbohydrate(27).build();

Першыя два аргументу з'яўляюцца абавязковымі (240 і 8). Іншыя атрыбуты не з'яўляюцца абавязковымі і могуць быць пастаўлены праз трапна названыя метады.

Вы ўсё яшчэ можаце выкарыстоўваць шаблон будаўнік, калі ў вас ёсць вялікая колькасць неабходных параметраў; Вы можаце праверыць, што яны былі ўсталяваныя ў зборкі() метад.

0
дададзена

Вы маглі б разгледзець пытанне аб тым, што інфармацыя ў файле уласцівасцяў, якія можна затым лёгка рэдагаваць. Ваш канструктар будзе прымаць імя файла уласцівасцяў і мае дадатковую працу па забеспячэнні паўнаты і праверкі. Хоць я да гэтага часу карысць моцна тыпізаваных канструктарамі, файл падыход ўласцівасць можа быць прасцей выкарыстоўваць у доўгатэрміновай перспектыве.

0
дададзена

Выкарыстоўвайце . Хоць звычайна выкарыстоўваецца за межамі ccnstructor, чаму не часткова ўнутры.

0
дададзена

JavaDoc + добрая IDE дапаможа вам высветліць, якія аргументы вы павінны прадаставіць.

У адваротным выпадку, вы можаце абгарнуць аргументы на адным аб'екце і перадаць у канструктар. Перагружаны канструктар будзе працаваць добра, таму што вы можаце распакоўваць аргументы і перадаць яго ў арыгінале.

Калі вы ведаеце, аргументы загадзя, вы заўсёды зьмясьціць іх у уласцівасцяў і чытаць іх з дапамогай java.util.Properties .

0
дададзена

У вас ёсць тры разумных варыянтаў, якія я бачу:

1) Выкарыстоўвайце стандартны забудоўшчык ( "радок", значэнне "радок", значэнне, ...) фармат.     Гэта, верагодна, больш намаганняў, чым вы хочаце змясціць у гэтую праграму.

2) Выкарыстоўвайце Канструктар() <�код /> метад, а затым setPropertyName (значэнне) метады для кожнага ўласцівасці.     Гэта дазволіць вам лёгка дадаць іх, але вам усё яшчэ трэба, каб зрабіць гэта ўручную.

3) Счытванне дадзеных з файла.     Настройка файла з выкарыстаннем калонкі з імёнамі (каб пазбегнуць проста перамяшчаючы «Я забыўся, што значэнне прыходзіць наступны» праблема ў іншым месцы) Гэта павінна быць лепшым.

0
дададзена

Я рэкамендую рэалізацыю стандартнага канструктара без якіх-небудзь параметраў. Інкубацыйны і Геттеры могуць быць атрыманы з дапамогай зацьмення. Гэта дапамагае трымаць погляд на ўсё і даданне або выдаленне членаў. Наступнае, што вы павінны зрабіць, гэта напісаць усё вашы рэчы транспартнага сродку ў файле XML. Тэгі дапамагчы вам з імёнамі транспартных сродкаў, каштоўнасцяў і г.д. Акрамя таго, даданне і выдаленне транспартных сродкаў будзе прасцей. Вы можаце атрымаць доступ да XML-файлаў з дапамогай JDOM. Проста прачытайце тэг аўтамабіля і выклікаць метады сетэра са значэннямі з файла XML. Гэта можа быць зроблена з дапамогай цыклу.

У рэшце рэшт, адзінае, што вы павінны паклапаціцца пра тое, файл транспартнага сродку XML.

Не саромейцеся пытаць, калі ёсць якія-небудзь пытанні.

0
дададзена

Мая прапанова было б стварыць аб'ект для захоўвання гэтых тыпаў з пэўным спісам параметраў пры ініцыялізацыі. Вы можаце падзяліць гэты аб'ект на аснове таго, што тыпы аб'яднаны лагічна. Тады вам трэба ўсяго толькі два ці тры канструктара з пяццю параметрамі кожнага. Напрыклад:

HeavyTank T110E5 = new HeavyTank("T110E5", 2200,54.56d, 875, 37, 30, 254,76,38, 203,127,70,300, 202, 6,32, 400,745,10);

б стаць:

StatObject1 stat1 = new StatObject1(2200, 54.56d);
StatObject2 stat2 = new StatObject2(875, 37, 30);
StatObject3 stat3 = new StatObject3(254, 76, 38);
...
HeavyTank T110E5 = new HeavyTank("T110E5", stat1, stat2, stat3, ...);

ці як гэта працуе лагічна для вашай сістэмы. Перавага гэтага ў тым, што вы можаце ўжыць гэта да любога іншага танку вы ствараеце, і можаце ствараць мадыфікатары ў кожным класе StatObject, спецыфічныя для гэтых дадзеных.

0
дададзена
... проста даць ім больш апісальныя імёны, чым StatObjectX .
дададзена аўтар Dukeling, крыніца