Qaysi vaziyatlarda biz o'zgaruvchilarni jamoat va usul sifatida xususiy qilib yaratamiz?

Hozir java va C ++ asoslarini o'rganyapman. Men Bizni C ++ kitobida o'qib chiqdim, deyarli har bir holda xavfsizlik maqsadlari uchun biz misol o'zgaruvchilari shaxsiy va usullarni omma e'tiboriga havola qilamiz. Biroq, bu kitobda ba'zi hollarda ommaviy o'zgaruvchilar va usullarni xususiy qilishimiz ham aytilgan.

Men doimo o'ylayman, qaysi hollarda buni qilamiz. Buni har kim tushuntirishi mumkinmi?

4
Iltimos, o'zingizning postlaringiz sifatini oshiring (matn terish, punktuatsiya, jumlalarni boshida katta harflar va h.k.).
qo'shib qo'ydi muallif Spook, manba
@chris, janob, iltimos, bir xil misol keltiring.
qo'shib qo'ydi muallif Mayank Tiwari, manba
@Spook, rahmat, buni keyingi safar eslayman ...
qo'shib qo'ydi muallif Mayank Tiwari, manba
Foydalanuvchilaringiz kamroq g'amxo'rlik qilmasligi kerak bo'lgan sinfda yordamchi funktsiyaga doim ehtiyoj sezilishi mumkin. Biror narsalarni yechishning qat'iy vazifalarini bajarish juda yaxshi.
qo'shib qo'ydi muallif chris, manba
Agar C ++ da bitta singleton qilsangiz, konstruktor alohida bo'ladi
qo'shib qo'ydi muallif Alexis, manba

8 javoblar

Xususiy usullar (yoki C ++ terminologiyasida xususiy a'zolar vazifalari) ko'pincha yordamchi funktsiyalar sifatida foydalidir. Misol uchun, ishni fraktsiyalarni qo'llashni o'ylab ko'ring, ammo sizning fraksiyangiz har doim normallashishini ta'minlashni xohlaysiz. Shundan keyin siz o'zingizning fraktsiyangizni normalizatsiya qiluvchi normalize() funktsiyasidan foydalanishingiz mumkin va har bir operatsiyadan keyingi normallashtirilmagan fraksiyonga olib kelishi mumkin, masalan, (C ++ kodi):

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;
}

Boshqa bir, C ++ maxsus funktsiyalardan foydalanish, C ++ da maxfiylik faqatgina kirishni nazorat qilish haqida emas, balki ko'rinishi haqida emas. Bu virtual klassdagi virtual funktsiyani amalga oshirayotganda base_class-dan oldingi holatni tekshirishni bajarishga imkon beradi:

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;
}

Foydalanuvchilar frobnicate deb chaqirilsa, base dan olingan sinflar base kodini bekor qiladi.

2
qo'shib qo'ydi
O'zgaruvchini jamoatchilik qilish haqida nima deyish mumkin? Buning uchun har qanday sabab bormi?
qo'shib qo'ydi muallif Ravid Goldenberg, manba
@Petrik Mening umumiy qoida shuki, barcha o'zgaruvchilar ham umumiydir (tuzilgan) yoki yo'q. Birinchidan, qulaylik uchun konstruktorlar qo'sha olaman (C ++ 03 da, baribir --- C ++ 11 da, unifikatsiyalashtirilgan sintaksisi katta talabni bartaraf qiladi) va menimcha, shaxsiy vazifamni xohlashim mumkin Ushbu quruvchilar tomonidan ishlatilishi mumkin (garchi u juda ko'p bo'lsa-da).
qo'shib qo'ydi muallif James Kanze, manba

Odatda statik yakuniy o'zgaruvchilar sinfda ommaviydir. Agar siz ushbu o'zgaruvchining qiymatini o'zgartirmoqchi bo'lmasangiz va boshqa sinflarga kirishni xohlasangiz, uni umumiy statik finalga aylantirasiz.

Xususiy usullar faqat shu sinf uchun ichki vazifani bajarish uchun sinfda qo'llaniladi. Foydali usul yoki ba'zi bir biznesni hisoblash usuli kabi. Yoki oddiy usul kodini bir nechta maxsus uslublarga aylantirish uchun, bu usullar juda katta bo'lmaydi.

1
qo'shib qo'ydi

Boshqaruvchi qoidalar, boshqa sinflarga kirish uchun ular yaxshi bo'lmaganda, public usullarini yaratasiz. ichki uslublar yoki yordamchi usullar yoki protected yoki private bo'lishi kerak. Protected Agar siz usulni sinchkovlik bilan oshiradiganlar tomonidan kengaytirishni xohlasangiz Buni faqat private belgisini belgilashni istamang.

0
qo'shib qo'ydi

xususiy usullar sinfi ichki foydalanish uchun mo'ljallangan. Ular boshqa jamoatchilik sinflaridan chaqirilishi mumkin. Bular shaxsiydir, chunki siz tashqi dunyodan ajralib qoldingiz.

Misol uchun

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. Misol uchun

public static  final int FLAG = true;

Siz to'g'ridan-to'g'ri tashqi o'zgaruvchini chaqirishingiz mumkin.

0
qo'shib qo'ydi

Bu sizning har bir sinf uchun qanchalik xavfsizligingiz bog'liqligiga bog'liq.

Misol uchun, sizda faqat V, y va z o'zgaruvchilari mavjud bo'lgan Vektorli sinf bo'lsa, ularni ommaviy qilishingiz kerak. Ko'pgina sinflar, ehtimol, Vektor sinfidan foydalanishadi va bu qiymatlardagi qiymatlarni o'zgartirsalar yaxshi bo'ladi.

Kredit karta raqamini, fon yozuvini, manzilingizni va hokazolarni saqlaydigan "Person" klassi bo'lsa, xavfsizlik masalalarini oldini olish uchun ularni maxsus qilishingiz kerak.

Biroq, siz barcha o'zgaruvchilardan shaxsiy sifatida foydalansangiz va ularning hammasiga ruxsat beruvchi va mutatsion vositalarni taqdim qilsangiz, ularni samarali tarzda jamoatchilikka o'xshash qilasiz (lekin ko'proq ish bilan).

EDIT: Barcha doimiy o'zgaruvchilar ommaviy bo'lishi kerak, chunki siz ularni o'zgartira olmaysiz. Statik o'zgaruvchilar ham vaziyatga bog'liq bo'lishi mumkin. Statik o'zgarishlarni statik o'zgaruvchilar uchun belgilash va ishga tushirish yaxshi.

0
qo'shib qo'ydi
Men buni allaqachon bilaman ...
qo'shib qo'ydi muallif Mayank Tiwari, manba
Xususiy bo'lish uchun hech qanday sabab yo'q! Nima uchun siz o'zgartirishga qodir biror narsani yashirish kerak?
qo'shib qo'ydi muallif Oleksiy, manba
Bularning barchasi xavfsizlik masalalaridan qochishdir. Muammo yo'q - maxsus kalit so'zga hojat yo'q.
qo'shib qo'ydi muallif Oleksiy, manba
@juanchopanza Nima uchun o'zgarmaydigan narsalarni o'zgartirish mumkin? Boshqa sinflarni doimiy ko'rishni cheklashni istamas ekanman, nima uchun uni yashirishim kerak?
qo'shib qo'ydi muallif Oleksiy, manba
@Cong Xu Xususiy sog'lomlashtirish qobiliyatini yaxshilashni qanday ta'minlaydi? Shunga qaramay, agar boshqa sinflar doimiylikni ko'rishga ruxsat etilmagan bo'lsa, men uni shaxsiy qilishning bir sababi haqida o'ylay olmayman.
qo'shib qo'ydi muallif Oleksiy, manba
Barcha doimiy o'zgaruvchilar ommaviy bo'lishiga hech qanday sabab yo'q. Ular umuman ommaviy bo'lish uchun hech qanday sabablarsiz amalga oshirilishi mumkin.
qo'shib qo'ydi muallif juanchopanza, manba
Yo'q, bu butunlay emas. Nima uchun mijozga ommaviy axborot kerak emas?
qo'shib qo'ydi muallif juanchopanza, manba
Nima uchun ommaviy bo'lishga hojat bo'lmagan omma oldida nimadir qilish kerak? OOPning asosiy tamoyilidir.
qo'shib qo'ydi muallif juanchopanza, manba
@ ole_92 Kirish identifikatorlarining nuqtasi, albatta, xavfsizlik bilan chegaralanib qolmaydi va xavfsizlik tavsifiga bog'liq holda, bu maqsadga erishish uchun juda kam. Kirish spesifikatorlari, shuningdek, umumiy interfeysning nima ekanligini aniq ko'rsatib, yanada yaxshi inkassatsiya qilishni ta'minlaydi.
qo'shib qo'ydi muallif congusbongus, manba
@ ole_92 to'g'ridan-to'g'ri emas, balki ular o'quvchilarga umumiy interfeysning bir qismi hisoblanmasligini aniq aytib berish orqali ularni inkassatsiya qilishda yordam beradi. Odamlar omma uchun barqarorligini ko'rsalar, ular bu haqda tashvishlanmaslik kerakmi, yoki u dasturning bajarilishi haqida darhol aniq emas. Vazifalardagi narsalarning shaxsiy sabablari mavjud C ++ va Java.
qo'shib qo'ydi muallif congusbongus, manba

Agar boshqa sinflarda varibale yoki metodga muhtoj bo'lmasangiz, uni ochiqdan-ochiq yozmang. Bu uslublar va o'zgaruvchilar uchun.

0
qo'shib qo'ydi

Xususiy o'zgaruvchilar yoki funktsiyalar faqat ular e'lon qilingan sinfda ishlatilishi mumkin.

Jamoat o'zgaruvchilari yoki vazifalari sizning ilovangizdagi hamma joylarda ishlatilishi mumkin.

Shunday qilib, ular tegishli bo'lgan sinfda FAQAT foydalanadigan barcha o'zgaruvchilar va funktsiyalarni shaxsiy sifatida e'lon qilishingiz kerak.

Misol:

public class Car {
    private String model;

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

    public getModel() {
        return model;
    }

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

Sinf sinfida biz "String" modelini shaxsiy sifatida e'lon qilamiz, chunki biz uni faqat sinfdagi "Car" sinfida ishlatmoqchi edik, buni boshqa sinflar setModel funktsiyasidan foydalanmasdan, ushbu satrning qiymatini o'zgartira olmaymiz.

SetModel va getModel funktsiyalari ommaviydir, shuning uchun biz faqatgina ushbu usullardan foydalangan holda boshqa sinflardan maxsus o'zgaruvchilar modeliga kirishimiz mumkin.

Ushbu misolda funktsiya setModel qiymati null qiymatini tekshirmaydi, bu holda qiymatni belgilamaydi. Siz bu erda String modelini ommaviy deb e'lon qilgan bo'lsangiz, siz uni qanday qiymatga yozib olishni nazorat qila olmaysiz.

DoSomething funksiyasi xususiy va boshqa sinflar uni ishlata olmaydi. Boshqa tomondan, bu funktsiya singari xususiy va u String modeli bo'lgan bir xil sinfga tegishli bo'lib, qiymatini setModel usulidan foydalanmasdan o'zgartirishi mumkin.

0
qo'shib qo'ydi

Agar metod sinfning boshqa usullari (jamoatchilik) tomonidan ishlatilsa va siz ob'ektni ushbu usulga to'g'ridan-to'g'ri kirishni xohlamasangiz, biz ushbu usulni xususiy qilib yaratamiz.

Va ayrim hollarda, siz o'zgarmaydiganga to'g'ridan-to'g'ri sinf obyektidan kirishni xohlasangiz, uni ommaviy qiling.

0
qo'shib qo'ydi