Қандай жағдайларда біз айнымалыларды қоғамдық және әдістер ретінде жеке етіп жасаймыз?

Қазіргі уақытта мен java және C ++ негіздерін үйреніп жатырмын. Мен Let Us C ++ кітабында оқыдым, бұл іс жүзінде әр жағдайда біз қауіпсіздікті қамтамасыз ету үшін жалпыға бірдей айнымалы мәндерді және әдістерді жалпыға ортақ етіп жасаймыз. Бірақ бұл кітапта кейбір жағдайларда біз айнымалылардың жалпыға ортақ және жеке әдістерін жасаймыз.

Мен үнемі ойланамын, қай жағдайда біз мұны істейміз. Мұны түсіндіріп беріңізші.

4
Постыңыздың сапасын жақсартыңыз (емле, пунктуация, сөйлемнің басында үлкен әріптер және т.б.).
қосылды автор Spook, көзі
@ chris, сэр, мүмкін, сол үшін кез келген мысал беріңіз.
қосылды автор Mayank Tiwari, көзі
@Spook, рахмет, келесі жолы мен есімде ...
қосылды автор Mayank Tiwari, көзі
Сіз әрдайым пайдаланушыларыңыз туралы қамқорлық жасамауы керек сыныптағы утилита функциясын қажет ете аласыз. Егер сіз қатаң функцияларды бір нәрсе жасай алсаңыз жақсы.
қосылды автор chris, көзі
C ++-де синглтон жасасаңыз, конструктор жеке-жеке болады
қосылды автор Alexis, көзі

8 жауаптар

Жеке әдістер (немесе C ++ терминологиясында жеке мүшелер функциялары) көбінесе көмекші функциялар ретінде пайдалы. Мысалы, фракцияларды іске асырғыңыз келетін жағдай туралы ойланыңыз, бірақ сіздің фракцияңыз әрқашан қалыпқа келтірілуін қамтамасыз етсін. Содан кейін фракцияны қалыпқа келтіретін және қалыпты емес фракцияға әкелуі мүмкін әр операциядан кейін шақырылатын normalize() функциясын қолдануға болады, мысалы (C ++ код):

class Fraction
{
public:
  Fraction(int num, int den = 1);
  Fraction operator+=(Fraction const& other);
  Fraction operator*=(Fraction const& other);
 //...
private:
  int numerator, denominator;
};

Fraction::Fraction(int num, int den):
  numerator(num),
  denominator(den)
{
  normalize();
}

Fraction Fraction::operator+=(Fraction const& other)
{
  int new_den = denominator*other.denominator;
  numerator = numerator*other.denominator + denominator*other.numerator;
  denominator = new_den;
}

Fraction Fraction::operator*=(Fraction const& other)
{
  numerator *= other.numerator;
  denominator *= other.denominator;
  normalize();
}

void Fraction::normalize()
{
  int factor = gcd(numerator, denominator);
  numerator /= factor;
  denominator /= factor;
}

Басқа жеке C ++-дің жеке функцияларын пайдалану C ++-де жеке көріну туралы емес, қатынасты бақылау туралы ғана екеніне негізделеді. Бұл виртуалды нақты функцияны орындау кезінде базалық класстан кейінгі жағдайдан кейінгі тексеруді жүзеге асыруға мүмкіндік береді:

class Base
{
public:
  foo frobnicate(some arguments);
private:
  virtual foo do_frobnicate(some arguments) = 0;
};

foo Base::frobnicate(some arguments)
{
  check_precondition(arguments);
  foo result = do_frobnicate(arguments);
  check_post_condition(foo);
  return foo;
}

Base ішінен алынған сыныптар do_frobnicate дегенді ауыстырады, ал пайдаланушылар алдымен/кейінгі жағдайларды тексеретін әрқашан тексеретін frobnicate деп атайды.

2
қосылды
Айнымалыға айналдыру туралы не айтасыз? Мұны істеудің қандай да бір себебі бар ма?
қосылды автор Ravid Goldenberg, көзі
@Petric Менің жалпы ереже не барлық айнымалылардың жалпыға бірдей (құрылым) немесе ешқайсысы болып табылмайды. Бірінші жағдайда ыңғайлы болу үшін конструкторларды қоса аламын (C ++ -де 03, кез келген жағдайда --- C ++ 11-де, бірыңғай инициализация синтаксисі көбінесе қажеттілігін жояды) және менің ойымша, жеке функция қажет болуы мүмкін бұл конструкторларға арналған (бірақ бұл өте жиі емес).
қосылды автор James Kanze, көзі

Әдетте статикалық соңғы айнымалы мәндер сыныпта ашық. Егер сіз айнымалы мәннің мәнін өзгертуді қажет етпесеңіз және оған басқа класстардың кіруін қаласаңыз, онда оны қоғамдық статикалық финалға айналдырасыз.

Жеке әдістер осы сыныпқа арналған тапсырманы орындау үшін тек сынып ішінде ғана қолданылады. Пайдалы әдіс немесе бизнесті есептеу әдісі сияқты. Немесе қарапайым әдістердің кодын көптеген жеке әдістерге шығару үшін, әдістер тым үлкен болмайды.

1
қосылды

Басқаларыңыздың ережесі басқа класстарға кіруге рұқсат болған кезде public әдістерін жасайсыз. ішкі әдістер немесе көмекші әдістер сіздің сыныпты кеңейтетін әдістерді кеңейтетін болса, protected немесе private . Protected бұл жай ғана оларды private деп белгілегіңіз келмейді.

0
қосылды

жеке әдістер класс ішкі қолдануға арналған. Оларды басқа қоғамдық сыныптардан шақыруға болады. Олар жекеменшік, өйткені сіз сыртқы әлемнен шығып кеттіңіз.

Мысалға

public void method1(){
    method2();
}

private void method2(){
   //for internal use
}

Public variables are mainly used for class variables in which cases there is no harm of direct accessing the variables from outside. Мысалға

public static  final int FLAG = true;

Айнымалыға сырттан тікелей қоңырау шала аласыз.

0
қосылды

Әрбір сынып үшін қанша қауіпсіздік қажет екеніне байланысты.

Мысалы, егер сізде Vector классы бар болса, тек x, y және z үш айнымалысы болса, оларды жалпыға ортақ етіп жасау керек. Көптеген сыныптар Vector сыныпты қолдануы мүмкін және олар құндылықтарды өзгерткен жағдайда жақсы.

Егер сізде несие картасының нөмірін, фон жазбасын, мекен-жайды және т.б. сақтайтын Тұлға класы болса, сіз оларды қауіпсіздік мәселелерінен аулақ болу үшін жеке етуіңіз керек.

Дегенмен, сіз барлық айнымалы мәндерді жеке ретінде қолдана аласыз және сіз оларға қол жеткізушілер мен мутацияшыларды қамтамасыз етесіз, оларды тиімді түрде қоғамдық (бірақ көп жұмыс істейтін) сияқты жасайсыз.

EDIT: Барлық тұрақты айнымалылар жалпыға ортақ болуы керек, себебі сіз оны өзгерте алмайсыз. Статикалық айнымалылар жағдайға байланысты екеуі де болуы мүмкін. Мүмкін статикалық статистикалық айнымалыларға арналған функцияларды орнатып алу керек.

0
қосылды
Мен мұны білемін ...
қосылды автор Mayank Tiwari, көзі
Жеке болуға да себеп жоқ! Неге өзгерте алмайтын нәрсені жасырады?
қосылды автор Oleksiy, көзі
Қауіпсіздік мәселелерін болдырмаудың басты мақсаты. Сұрақ жоқ - жеке кілт сөздің қажеті жоқ.
қосылды автор Oleksiy, көзі
@juanchopanza Неліктен өзгерте алмайтын жеке нәрсе жасайсыз? Мен басқа сабақтарды үнемі көріп тұруды шектеуді қаламай, оны неге жасырамын?
қосылды автор Oleksiy, көзі
@CongQu Жеке константтардың жақсы инкапсуляцияны қалай қамтамасыз етеді? Тағы да, егер басқа сабақтарды тұрақты көруге рұқсат етілмесе, мен оны жекешелендірудің бір себебі туралы ойламаймын.
қосылды автор Oleksiy, көзі
Тұрақты айнымалылардың жалпыға ортақ болуы үшін ешқандай себеп жоқ. Олар жалпыға ортақ болуы үшін ешқандай себепсіз іске асырылатын егжей-тегжей болуы мүмкін.
қосылды автор juanchopanza, көзі
Жоқ, бұл барлық нүкте емес. Неліктен клиентке қажет емес нәрсе жасайсыз?
қосылды автор juanchopanza, көзі
Неге қоғамға қажет емес нәрсе жасауға болады? OOP негізгі принципі.
қосылды автор juanchopanza, көзі
@ ole_92 Кіру сипаттамаларының нүктесі қауіпсіздікпен шектелмейді, және қауіпсіздік анықтамасына байланысты, ол кез келген жағдайда бұл мақсатқа жетіспейді. Сонымен қатар, қолжетімділік спецификаторы инкапсуляцияны жақсы қамтамасыз етеді, бұл жалпыға ортақ интерфейстің не екенін нақты анықтайды.
қосылды автор congusbongus, көзі
@ ole_92 тікелей емес, бірақ олар инкапсуляцияға оқырмандарға жалпыға ортақ интерфейстің бөлігі болып табылмайтындығын айқындауға көмектеседі. Егер адамдар қоғамдық тұрақтылықты көріп отырса, олар бұл туралы алаңдаушылық туғызуы керек немесе егер ол іске асырудың егжей-тегжейі болса, түсініксіз. Бөлшектердің әдепкі бойынша жеке болып табылатын себептері бар C ++ және Java.
қосылды автор congusbongus, көзі

Егер сіз басқа сыныптарда вариантты немесе методты қажет етпейтін болсаңыз, оны жарияламаңыз. Бұл әдістер мен айнымалыларға арналған.

0
қосылды

Жеке айнымалылар немесе функциялар тек оларда жарияланған сыныпта пайдалануға болады.

Ашық айнымалылар немесе функциялары қолданбаңыздың кез келген жерінде қолданыла алады.

Осылайша, олар өздері тиесілі сыныпта ONLY қолданатын барлық айнымалылар мен функцияларды жеке түрде жариялауыңыз керек.

Мысал:

public class Car {
    private String model;

    public setModel(String model) {
        if (model != null)
            this.model = model;
    }

    public getModel() {
        return model;
    }

    private doSomething() {
        model = "Ford";
    }
}

Автокөлік сыныпында String моделін жеке ретінде жариялаймыз, себебі оны тек сыныптағы автокөлікте қолдануға тырысамыз, мұны жасаймыз, басқа сыныптар функция setModel функциясын пайдаланбастан, осы жолдың мәнін өзгерте алмайтындығына кепілдік береміз.

SetModel және getModel функциялары жалпы болып табылады, сондықтан біз басқа әдістерден тек жеке әдіспен айнымалы үлгіге қол жеткізе аламыз.

Бұл мысалда функция setModel мәні нөл мәнін тексереді, бұл жағдайда ол мәнді орнатпайды. Сіз String моделін жалпыға ортақ деп жариялаған болсаңыз, сіз оны жазудың қандай мәніне ие боласыз.

DoSomething функциясы жеке және басқа сыныптар оны пайдалана алмайды. Басқа жағынан, бұл функция секілді жеке және ол String үлгісі бар бір сыныпқа жатады, ол setModel әдісін пайдаланбастан оның мәнін өзгерте алады.

0
қосылды

Әдісті сыныптың басқа әдістерімен (жұртшылығымен) қолданған кезде және сіз бұл әдіске тікелей қол жеткізуді қаламасаңыз, біз бұл әдісті жеке ретінде жасаймыз.

Кейбір жағдайларда, айнымалы мәнге сынып нысанынан тікелей кіргіңіз келсе, оны жалпыға ортақ етіп жасаңыз.

0
қосылды