AMcoder - javascript, python, java, html, php, sql

Կոնստրուկտորում արգումենտներ փոխանցելու լավագույն միջոցը

Ես ունեմ դաս, որը տողեր է ստեղծում աղյուսակի դասավորության մեջ: Տողերի ստեղծումը կախված է տվյալներից և մետատվյալներից: Քանի որ մետատվյալները նույնն են յուրաքանչյուր տողի համար, օրինակ՝ ցույց տալ/թաքցնել տեսանելիության հատկությունները և այլն։ Ես ստեղծել եմ մետատվյալների հատկությունը որպես ստատիկ և սկզբնավորել մեկ անգամ՝ օգտագործելով initWidgetRowWidget-ից:

պարզապես օրինակ.

class RowWidget extends FlexTable{

  public static void initWidget(Form form,
    HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
    GridMode gridMode,
    boolean isApplied,
    boolean isChildExist,
    boolean isChildAttachment)
    { 
      // ...
    }
}

Այնուհետև ես զանգահարեցի ստորև նշված կոնստրուկտորին յուրաքանչյուր ռեկորդային տվյալների համար:

public RowWidget(DataRawType dataRawType, Data data, Data parentData) {
 // ...
}

Ինչպես կարծում էի, սա ճիշտ մոտեցում չէ։ քանի որ որպես օրինակ, երբ որևէ մեկը տեսնում է այս դասը, այնուհետև հասկանում է, որ այն կստեղծի մեկ տող: Ես չեմ ուզում սկզբում զանգահարել initWidget: Ես ուզում եմ փոխանցել յուրաքանչյուր պահանջվող պարամետր կոնստրուկտորում միայն like

public RowWidget(DataRawType dataRawType,
  Data data,
  Data parentData,
  Form form,
  HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
  GridMode gridMode,
  boolean isApplied,
  boolean isChildExist,
  boolean isChildAttachment) {
  // ...
}

Բայց դրա շնորհիվ կոնստրուկտորը փաստարկներ չունի: և կարծում եմ, որ կոնստրուկտորում 5+ պարամետր ունենալը նույնպես վատ օրինակ է:

Ինչ-որ մեկը ինձ առաջարկում է.

  • Ինչպե՞ս կառուցել դաս, որն ունի մեկ այլ օրինակում պահանջվող նույն հատկությունը:

Նշում. Ես գիտեմ, որ դա հնարավոր է միայն ստատիկ միջոցով, բայց չեմ ուզում օգտագործել ստատիկ:

  • Ո՞րն է դասի կառուցման լավագույն միջոցը՝ ունենալով որոշ կանխադրված ամրագրման հատկություն բոլոր ատյանների համար:

Նշում. ես չեմ ցանկանում ստեղծել այլ դաս՝ դրան հասնելու համար: կամ ստացողի/սեթերի ցանկացած մեթոդ:

Նախապես շնորհակալություն.

28.05.2013

  • Դուք կարող եք մի փոքր կրճատել ձեր պարամետրերի ցանկի երկարությունը, եթե բուլյան պարամետրերը դարձնեք Map կամ Set, ինչպես արեցիք ձևի թույլտվությունների դեպքում: 28.05.2013
  • այո, ես կարող եմ: թող որևէ մեկը այլ մոտեցում չունենա: Ես կգնամ դրան: 28.05.2013
  • Դե, եթե դուք իսկապես չեք ցանկանում որևէ նոր դաս, ցանկանում եք ազատվել ստատիկ և երկար պարամետրերի ցանկից, ի՞նչ կասեք այս ԿԵՂՏ առաջարկի մասին. օգտագործեք Map<String, Object> ձեր պարամետրերը պահելու համար, մեկ անգամ լրացրեք և փոխանցեք այն: քարտեզագրեք RowWidget կոնստրուկտորին և ստացեք+ձուլեք դրանք օգտագործելու համար՝ կառուցելիս: Սա ամենավատն է, քան երկար պարամետրերի ցանկը, քանի որ վերջինն ավելի հստակ է, թե ինչ պարամետրերի կարիք ունի դասը և ավելի ընթեռնելի/պահպանելի: Դուք նույնպես պետք է վերանայեք ձեր դիզայնը: Ի՞նչն է ձեզ խանգարում նոր դասի ներդրմանը: 28.05.2013
  • @A4L hehe, դա հենց իմ առաջին միտքն էր, երբ կարդացի no-new-class-note-ը, բայց չհամարձակվեցի առաջարկել այն;) 28.05.2013
  • @MarcoForberg հա... դրա համար էլ միայն որպես մեկնաբանություն է եկել ;-) 28.05.2013
  • @A4L Ես համաձայն եմ ձեզ հետ, սա ամենավատ դեպքերն են.. և դա շփոթություն է.. դա այդպես է: Ես այս հարցը ավելացրի SO-ում, որպեսզի պարզեմ իմ կասկածը փորձագիտական ​​եզրակացությունից: գաղափար ունես 28.05.2013
  • @Bhumika, ցավոք սրտի, ես չեմ կարող այլ գաղափարներ մտածել, քան արդեն այստեղ առաջարկված է առայժմ :/ 28.05.2013

Պատասխանները:


1

Ես կառաջարկեի շինարարական օրինակ: Ձեզ անհրաժեշտ կլինի մեկ լրացուցիչ դաս RowWidget օբյեկտներ ստեղծելու համար: Այսպիսով, զանգը կունենա հետևյալ տեսքը.

RowWidget widget = new RowWidget.Builder().withData(data).withParentData(parentData).withDataRawType(dataRawType).build();

Ահա օրինաչափության հստակ բացատրությունը՝https://stackoverflow.com/a/1953567/991164

28.05.2013
  • Բայց այստեղ բաց թողնվելու հնարավորություն կա 28.05.2013
  • Եթե ​​Ձեզ անհրաժեշտ է համոզվել, որ արկերից ոչ մեկը բացակայում է, պարզապես կատարեք ստուգում build() մեթոդով և բացառություն արեք, եթե դա կա: 28.05.2013

  • 2

    Ինչու չստեղծել մեթոդ, որը կընդունի նոր արժեքները այն հատկությունների համար, որոնք ցանկանում եք փոխել և կվերադարձնի դասերի նոր օրինակ բոլոր մյուս հատկություններով, որոնք պատճենված են այն օրինակից, որի վրա դուք կանչել եք այս մեթոդը:

    28.05.2013

    3

    Դուք կարող եք առանձնացնել/արտահանել պարամետրերը RowWidget-class-ից, օրինակ՝ RowWidgetConfig-դասում:

    class RowWidgetConfig {
        // put here all your parameters that you need to initialize only once
        // init using setters
    }
    

    Այժմ ստեղծեք այդ դասի մեկ օրինակ և փոխանցեք այն մյուս պարամետրերի մեջ RowWidget կոնստրուկտորին:

    Մեկ այլ այլընտրանք կլինի factory ունենալը RowWidget ատյաններ ստեղծելու համար: Գործարանը նաև կպարունակի բոլոր այն պարամետրերը, որոնք ձեզ անհրաժեշտ են տողային օրինակի համար, գումարած գործարանային մեթոդ createNewRowWidget, որը ստեղծում է օրինակի հիմք գործարանում պարունակվող պարամետրերի վրա:

    class RowWidgetFactory {
        // put here all your parameters that you need to initialize only once
        // init using setters
    
        public RowWidget createNewRowWidget() {
            // create
            return ...
        }
    }
    
    28.05.2013
  • ՕՊ-ն ասաց, որ նա այլ դաս չի ուզում: Նշում. ես չեմ ցանկանում ստեղծել այլ դաս՝ դրան հասնելու համար: 28.05.2013
  • @MarcoForberg օպ, ես բաց եմ թողել այդ մանրուքը :/ 28.05.2013
  • բայց ես պետք է խոստովանեմ, որ կոնֆիգուրացիայի դասը առաջին բանն էր, որ մտքովս անցավ ;9 28.05.2013
  • @MarcoForberg Ինձ իսկապես հետաքրքիր է, թե ինչպես կարելի է դա անել: Ես կջնջեմ այս պատասխանը, քանի որ այն օգտակար չէ OP-ի համար: 28.05.2013
  • ես նույնպես! Կարծում եմ, որ կոնֆիգուրացիայի դասը լավ կլիներ, չնայած այն հանգամանքին, որ նա նոր դաս չի ուզում: 28.05.2013

  • 4

    Ինչպե՞ս կառուցել դաս, որն ունի մեկ այլ օրինակում պահանջվող նույն հատկությունը:

    Դրան հասնելու համար դուք կարող եք ունենալ սուպեր դաս՝ ձեր ուզած բոլոր հատկություններով: Այսպիսով, այս սուպեր դասը ընդլայնող ցանկացած դաս կունենա այս հատկությունները: Այս կերպ ձեզ հարկավոր չէ օգտագործել static հիմնաբառ:

    Ո՞րն է դասի կառուցման լավագույն միջոցը՝ ունենալով որոշ կանխադրված ամրագրման հատկություն բոլոր ատյանների համար:

    Այս մեկի համար դուք կարող եք ունենալ ինտերֆեյս մի քանի հաստատուն հատկություններով: Այս կերպ ցանկացած դաս, որն իրականացնում է այս ինտերֆեյսը, կունենա ֆիքսված հատկություններ:

    28.05.2013
  • Ես գիտեմ սուպեր դասի հետ, բայց խնդրում եմ կարդացեք իմ հարցը: Ինձ դա պետք չէ։ AFAIK սուպեր դասին անհրաժեշտ է, երբ վերահսկիչներից ոչ մեկը չունի նույն հատկությունը: այստեղ ես ունեմ միայն մեկ վերահսկողություն. իսկ սուպեր դասի սկզբնավորման համար ինձ անհրաժեշտ է կոնստրուկտոր: ճիշտ? այնպես որ ես նույնպես պետք է փաստարկ ներկայացնեմ, թե ինչպես այնտեղ .. ճիշտ է: ինչպես? 28.05.2013
  • @Bhumika. Քանի որ դուք ունեք նույն հատկությունները մի քանի հսկիչների համար, ապա դուք կարող եք պարզապես սահմանել դրանք սուպեր դասում, այնպես որ ձեզ անհրաժեշտ կլինի լռելյայն առանց փաստարկների կոնստրուկտոր: 28.05.2013

  • 5

    Ստատիկ initWidget() բանն ինձ համար պարզապես ճիշտ չի թվում: Թեև, հավանաբար, այժմ դուք կունենաք RowWidgetերի միայն մեկ հավաքածու, որոնք կիսում են որոշ հատկություններ, խելամիտ է նաև ունենալ RowWidgetների 2 հավաքածու, որոնցից յուրաքանչյուրը կունենա իր «համօգտագործվող» հատկությունները: Ամեն ինչ շատ ավելի սահուն կլինի, և դուք կունենաք շատ ավելի մեծ ընտրություն ավելի խելամիտ API-ներ ստեղծելու համար, եթե վերամշակեք ձեր կոդը՝ ավելի խելամիտ ձևավորում ստեղծելու համար:

    Ենթադրենք, որ հիմա ես ներկայացնում եմ RowGroup-ի նման մի բան (որը մի տեսակ ներկայացնում է ձեր նշած «համօգտագործվող» բանը)

    (Անկեղծ ասած, ես այնքան էլ չեմ հասկանում ձեր դիզայնի իմաստը, ես պարզապես այն կազմում եմ ձեր ծածկագրի հիման վրա);

    public class RowGroup {
        public RowGroup(Form form,
                        HashMap<Long, ContractorPermissionEnum> formModePermissionMap,
                        GridMode gridMode,
                        boolean isApplied,
                        boolean isChildExist,
                        boolean isChildAttachment) { .... }
    
        public void addRow(DataRawType dataRawType, Data data, Data parentData) {...}
    }
    

    Երբ մարդիկ օգտագործում են, այն նման է.

    RowGroup rowGroup = new RowGroup(form, permissionMap, gridMode, isApplied, isChildExist, isChildAttach);
    rowGroup.addRow(DataRawType.A, dataA, parentA);
    rowGroup.addRow(DataRawType.B, dataB, parentB);
    

    Դուք նույնիսկ կարող եք տրամադրել շինարարի նման շարահյուսություն կամ շատ այլ ընտրություններ:

    RowGroup rowGroup 
            = new RowGroup(.....)
                  .addRow(DataRawType.A, dataA, parentA)
                  .addRow(DataRawType.B, dataB, parentB);
    

    Նույնիսկ ավելի կարևոր է, որ դիզայնն այժմ ավելի իմաստալից է ինձ համար:

    28.05.2013

    6

    Եթե ​​դուք չեք ցանկանում ստեղծել այլ դաս, ես կառաջարկեի այն, ինչ առաջարկում էր A4L-ը: Առանց այլ դաս ստեղծելու, ես կստեղծեի կոնստրուկտոր, որը վերցնում է բոլոր պարամետրերը և գործարանային մեթոդը, որն օգտագործում է ընթացիկ օրինակը որպես ձևանմուշ և կփոխանցի իր սեփական պարամետրերը կոնստրուկտորի պարամետրին:

    օրինակ (բացված ակնհայտ մասերով)

    class A{
      public A(int p1, int p2){...}
      public A create(int p2) {
        return new A(this.p1,p2);
    }
    
    28.05.2013
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..