Nima uchun "funktsiyalar va ma'lumotlar o'rtasidagi qattiq ulanish" yomon?

I found this quote in "The Joy of Clojure" on p. 32, but someone said the same thing to me over dinner last week and I've heard it other places as well:

[A] ob'ektga asoslangan dasturlashning salbiy tomoni shunchalik qattiq   funktsiya va ma'lumotlar o'rtasidagi aloqalar.

Nima uchun keraksiz kuplajni dasturda yomon deb bilaman. Shuningdek, Ob'ektni yo'naltirilgan dasturlashda ham o'zgarmas davlat va merosdan qochish kerakligini aytdim. Lekin sinflardagi funktsiyalarni nima uchun yopishqoqlik yomon deb bilmayman.

Boshqacha qilib aytganda, sinfga vazifani qo'shish Gmail-ga xat yuborish yoki papkada faylni yopish kabi ko'rinadi. Uni yana topishga yordam beruvchi tashkiliy texnika. Siz ba'zi bir mezonlarni tanlaysiz, so'ngra birga bo'lgan narsalarga o'xshashsiz. OOPdan oldin bizning dasturlarimiz fayllardagi juda ko'p katta sumkalar edi. Demak, vazifalarni bir joyga qo'yish kerak. Nega ularni tashkil qilmaslik kerak?

Agar bu turdagi yoppasiga hujum bo'lsa, nima uchun ular faqat kirish va chiqish turini funktsiyani cheklash noto'g'ri deb aytishmaydi? Men bunga rozi bo'lishimga ishonchim komil emas, lekin hech bo'lmaganda pro va konsignatsiya xavfsizligi uchun dalillarni yaxshi bilaman. Bu men uchun juda ham alohida tashvish kabi eshitiladi.

Tabiiyki, ba'zida odamlar noto'g'ri ma'lumotlarga ega bo'lishadi va noto'g'ri sinfga funksiya qo'yishadi. Ammo boshqa xatolarga qaraganda, bu juda kichik noqulaylik kabi ko'rinadi.

Shunday qilib, Clojure nomlari bor. OOPdagi bir funktsiyani qanday bajarishni Clojure nomidagi bir funktsiyani bajarishdan farq qiladi va nega bu juda yomon? Esda tutingki, sinfdagi funktsiyalar faqat shu sinfning a'zolari tomonidan ishlamaydi. Java.lang.StringBuilder-ga qarang-u har qanday turdagi yoki avtomatik boks orqali har qanday turdagi operatsiyalar bo'yicha ishlaydi.

P.S. Bu taklif men o'qimagan kitobga ishora qiladi: Leda multiparadigm dasturlash: Timothy Budd, 1995 .

36
Agar siz fayllaringizni sinflarga o'xshash usullar bilan to'liq tartibga keltirsangiz ham, OOPni kodni tashkil etish va faylni tuzishga qodir emas. VB modul va sinflarga ega; Ikkalasini aralashtirmang.
qo'shib qo'ydi muallif bstpierre, manba
Sizning nomingiz so'rovi tanasiga mos kelmaydi. Funktsiyalar va ma'lumotlar naqadar yomonlashganligini tushuntirish oson emas, lekin matningiz "OOP buni bajaradimi?", "Agar shunday bo'lsa, nima uchun?" va "bu yomon narsa emasmi?". Hozircha siz ushbu uchta savoldan biriga yoki bir nechtasiga javob beradigan va undagi oddiy savolni qabul qilmagan kishilarga javob olish uchun egasidirģ.
qo'shib qo'ydi muallif Stella Biderman, manba
Mening OAVni tanqid qilish, OOPning Java-da amalga oshirilganidek, tanqid qilinayotganligidan iboratdir. Buning sababi shunchaki somon odam emas, balki ular OOP bilan bog'langanligi uchun emas. Statik terish haqida shikoyat qilgan odamlar bilan o'xshash muammolar mavjud. Savollarning aksariyati kontseptsiyaga xos emas, balki bu kontseptsiyani keng ommalashtirishda kamchiliklarni keltirib chiqaradi.
qo'shib qo'ydi muallif user8669, manba
@GlenPeterson Men aslida bitta gapni yozishni xohlaganim uchun va u o'sishda davom etdi
qo'shib qo'ydi muallif user8669, manba
Instant usullari (erkin funksiyalardan yoki kengaytma usullaridan farqli o'laroq) boshqa modullardan qo'shilmaydi. Bu esa, faqat namuna usullari bilan amalga oshirilishi mumkin bo'lgan interfeyslarni ko'rib chiqayotganda cheklovlarni ko'paytiradi. Turli modullarda interfeys va sinfni aniqlay olmaysiz va keyin ularni uchinchi moduldan birgalikda bog'lash uchun koddan foydalaning. Haskell turidagi sinflar kabi yanada moslashuvchan yondashuv buni amalga oshirishga qodir bo'lishi kerak.
qo'shib qo'ydi muallif user8669, manba
OOPdan oldin bizning dasturlarimiz fayllardagi juda ko'p katta sumkalar edi. Demak, vazifalarni bir joyga qo'yish kerak. - "Xuddi shu ob'ektga tegishli funktsiyalarni qo'ying" - bu "OOP", ya'ni C ++ - "sinflar bilan". Chet ellik nuqtai nazardan qaraganda, bu qarash ga o'xshash bo'lishi mumkin, ammo agar siz bu kriteriyani qabul qilsangiz OOP/C ++ ni saqlab turasiz.
qo'shib qo'ydi muallif Izkata, manba
Yon eslatma: Ma'lumotlarni va funktsiyalarni dekompilyatsiya qilishni istasangiz, OOP da ma'lumotlar strukturasini ishlatishingiz mumkin (va kerak). Protsessual kod (ma'lumotlar tuzilmalari yordamida kod) mavjud ma'lumotlar strukturalarini o'zgartirmasdan yangi funktsiyalarni qo'shishni osonlashtiradi. OO kodi, mavjud funktsiyalarni o'zgartirmasdan, yangi sinflarni qo'shishni osonlashtiradi. Yaxshi namunalardagi dasturchilar qachon va qachon foydalanishni bilishadi. Ba'zida siz oddiy axborot strukturalarini ular bilan ishlaydigan vositalar bilan ishlashni xohlaysiz.
qo'shib qo'ydi muallif WoJ, manba
@Euphoric Menimcha, yozuvchi qilgan tushunaman, lekin Clojure jamoasi OOP ning somonli odamini yoqtirmoqchi va yaxshi axlat yig'ishdan oldin dasturlashning barcha yomonliklari uchun chiroylik sifatida yoqish kabi ko'rinadi. xotira, tezkor protsessorlar va diskdagi bo'sh joy. Men OOPda urishdan voz kechsalar va haqiqiy sabablarni aniqlasalar: masalan, Von Neumaning arxitekturasi.
qo'shib qo'ydi muallif GlenPeterson, manba
Kechki ovqatdan kim bu haqda gapiradi? Bu faqat nerdy fistikslarga olib keladi
qo'shib qo'ydi muallif James, manba
Menimcha, yozuvchi OOPni to'g'ri tushuna olmadi va faqatgina Java-ning yomonligi va Clojure-ning yaxshi ekanligini aytish uchun yana bir sabab kerak edi./rant
qo'shib qo'ydi muallif Euphoric, manba
Merosning yomonligi (kengaytirishdan ko'ra ko'proq bo'lishi kerak) va polimorfizm bilan shartlarni almashtirishning afzalliklari yo'qligi bilan bir vaqtda, OOP ning boshidanoq ma'no bo'lgan degan xulosaga kelish mumkin: valjok.blogspot.com/2013/01/…
qo'shib qo'ydi muallif Noah Spurrier, manba

6 javoblar

Nazariy jihatdan yumshoq funksiya-ma'lumotlar birikmasi bir xil ma'lumotlarda ishlash uchun ko'proq funktsiyalarni qo'shishni osonlashtiradi. Pastga tomon ma'lumotlar strukturasini o'zi o'zgartirishi qiyinlashadi, shuning uchun amalda yaxshi ishlab chiqilgan funktsional kod va yaxshi ishlab chiqilgan OOP kodlari bir-biriga o'xshash kuplaj darajasiga ega.

Misol ma'lumot strukturasi sifatida yo'naltirilgan harakatlanmagan grafikani (DAG) oling. Funktsional dasturlashda siz yana o'zingizni takrorlashdan qochish uchun ba'zi bir ajralmaslikka ehtiyoj sezasiz, shuning uchun tugunlarni va qirralarni qo'shish va o'chirish, ma'lum bir tugundan yetkaziladigan tugunlarni topish, topologik tartiblashtirish yaratish va hokazo. kompilyator uni majburlamasa ham, ma'lumotlar bilan samarali bog'langan. Siz tugunni qiyin yo'lni qo'shishingiz mumkin, lekin nima uchun xohlaysiz? Bir modul ichidagi o'zaro bog'liqlik tizim bo'yicha qattiq birlashuvni oldini oladi.

Aksincha OOP tomonida, asosiy DAG operatsiyalaridan boshqa funktsiyalar, alohida parametr sifatida topshirilgan DAG obyekti bilan alohida "view" sinflarida amalga oshiriladi. Funktsional dasturda ko'rib turganingizdek, DAG ma'lumotlarida ishlaydigan ko'p funktsiyalarni qo'shish oson. Derleyici sizni har bir narsani bitta sinfga aylantirishdan saqlaydi, ammo siz hamkasblaringiz bo'ladi.

Dasturiy paradigmalarning o'zgarishi abstraction, cohesion va couplingning eng yaxshi amaliyotlarini o'zgartirmaydi, faqatgina kompilyatorni qo'llaydigan amallarni o'zgartiradi. Funktsional dasturlashda, funktsional ma'lumotlar bilan bog'lanishni istaganingizda, kompilyatorga emas, balki janoblarning kelishuviga asoslangan. OOPda, modelni ajratish sehrgar emas, balki janoblarning kelishuvi bilan amalga oshiriladi.

31
qo'shib qo'ydi

Agar siz buni bilmagan bo'lsangiz, bu fikrni oling: ob'ektga yo'naltirilgan va yopilgan tushunchalari > bir xil tanga ikki tomoni. Ya'ni, yopilish nimani anglatadi? Funktsiyani ichida o'zgaruvchan (lar) ni yoki ma'lumotlarni o'z ichiga oladi va uni o'z ichiga funksiya ichida bog'laydi yoki OO-nuqtai nazaridan siz, masalan, biror narsani konstruktorga topshirsangiz, keyinchalik uni ishlatishingiz mumkin Ushbu misolning a'zo funktsiyasidagi ma'lumotlarning bir qismi. Biroq atrofdagi narsalardan atrofni tortib olish - bu yaxshi ish emas - atrofdagi muhit kengroq bo'lsa, shuning uchun ham yomonroq (garchi pragmatik tarzda, ba'zi yomonlik ko'pincha ishni bajarish uchun zarur). Global o'zgaruvchilardan foydalanish, bu dasturdagi vazifalar dastur doirasidagi o'zgaruvchan funktsiyalardan foydalanish - bu, albatta, chindan ham yomon bo'lgan holatlardir. Global o'zgaruvchilar nima uchun yomon ekanligi haqida boshqa joylarda yaxshi tushuntirishlar mavjud.

Agar OO texnikasiga rioya qilsangiz, asosan sizning dasturingizdagi har bir modul yovuzlikning ma'lum bir darajasiga ega bo'lishini qabul qilasiz. Agar siz dasturlash uchun funktsional yondashuvni tanlasangiz, dasturda hech qanday modulni yopish yomonligini o'z ichiga olmaydi, garchi siz hali ham ba'zi bo'lishi mumkin bo'lsa-da, lekin u juda kam bo'ladi.

Bu OO ning salbiy tomoni - bu bunday yovuzlikni rag'batlantiradi, ma'lumotlar yopish standartlarini yaratish orqali ishlashga moslashtiriladi (bir turdagi dasturni buzilgan oyna nazariyasi ).

Faqatgina ortiqcha tomondan, agar siz boshlash uchun ko'plab yopilishlardan foydalanmoqchi bo'lganingizni bilsangiz, hech bo'lmaganda siz o'rtacha dasturchani tushunishingiz uchun bu usulni tashkil qilishda siz uchun idealografik asos yaratib berasiz. Ayniqsa, yopiq bo'lgan o'zgaruvchilar konstruktorda aniq bir funktsiya yopilishida emas, balki ochiq-oydin emas. Ko'p yopilganlarni ishlatadigan funktsional dasturlar, odatda, teng bo'lmagan dasturga qaraganda ko'proq mantiqiydir, lekin kam bo'lmagan zarracha :)

13
qo'shib qo'ydi
Sizning so'nggi xatboshingiz bo'lsa, javobingizni saqlaydi. Sizga ko'ra, bu faqat bitta ortiqcha tomon bo'lishi mumkin, lekin bu kichik narsa emas. Bizni "o'rtacha dasturchilar" deb ataymiz, aslida qandaydir jiddiy marosimni kutib turibdi.
qo'shib qo'ydi muallif sgwill, manba
Siz haqiqatdan ham nima uchun siz yomon deb atagan narsalar yomon ekanini tushunmadingiz; Siz ularni faqat yomon deb atayapsiz. Nima uchun ular yovuz ekanligingizni tushuntirib bering va siz janobning savoliga javob olishingiz mumkin.
qo'shib qo'ydi muallif sgwill, manba
@Izkata Keraksiz, tipdagi xavfsiz tilda, katta miqdorda qozon plitasi va cheksiz pastki toifadagi (yoki pushti va tuzilmasiz imperativ mantiq) qiymati. Men buni "juda keraksiz" deb atashga rozi bo'lmaganman. Bu mumkin , lekin menda muqobil variant bo'lsa, u erga borishni istamasdim.
qo'shib qo'ydi muallif Stella Biderman, manba
Agar OO va yopilishlar sinonimiy bo'lsa, unda nima uchun juda ko'p OO tillari ularga aniq yordam bera olmadi? Siz keltirgan C2 wiki sahifasi ushbu sayt uchun odatdagidan ko'ra ko'proq tortishuvlarga (va kam konsensus) ega.
qo'shib qo'ydi muallif Stella Biderman, manba
@itsbruce "Ko'p miqdorda qozon plitasi va cheksiz pastki sinfi (yoki pushti va tuzilmasdan majburiy mantiq) narxida" OOP kabi tovushlar buzilgan so'zlar bilan aqldan ozgan va " mumkin OOP qiymati saqlab qolinadigan kod. Hatto Java-da, agar bu to'g'rida to'g'riroq bo'lsa (garchi bu Python'dan ko'proq bo'lsa-da).
qo'shib qo'ydi muallif Izkata, manba
@itsbruce Ular asosan keraksiz. Buning o'rniga "yopiq" bo'lgan o'zgaruvchilar ob'ektga kiritilgan sinf o'zgaruvchilari bo'ladi.
qo'shib qo'ydi muallif Izkata, manba
Aslida, Java-da, leksik yopilish ba'zan o'zgarmaslikni ta'minlashning oddiy usuli - bu erda "Immutable Map" o'rnimga qarang: glenpeterson.blogspot.com/2013/07/…
qo'shib qo'ydi muallif GlenPeterson, manba
Men avvalgi sharhimni talab qilmoqchiman. Men, "Kunning funktsional dasturlash punkti - ishni bajarish uchun ba'zi yomonlik ko'pincha kerak bo'ladi", dedim. Umuman olganda, men faqat yovuzlikni himoya qilyapman, faqatgina funktsional dasturiy ma'noda.
qo'shib qo'ydi muallif GlenPeterson, manba
Kunning ta'rifi: "Ba'zi yovuzlik ishlarni bajarish uchun ko'pincha kerak"
qo'shib qo'ydi muallif GlenPeterson, manba
Men yana bir savolga global davlatning yovuzligi haqida gapirganini ko'rdim. Men faqat "ortiqcha tomon" deb aytganimda she'riy litsenziyani amalga oshirgan bo'lardim. O'ylaymanki, siz "o'rtacha dasturchi" degan so'zni noto'g'ri tushungansiz. Men odatdagi dasturchi bo'lgan odatdagi insonni nazarda tutyapman - va ba'zi bir malakali darajalar kutilsa-da, bu darajani psixikaga aylantirishni talab qiladigan elitist. Siz bilan rozi bo'laman - biron bir paradigma yoki tilni o'qish yoki yozishni rag'batlantiradigan tilni nishonlash arziydi. O'zim, men har doim OO yondashuvidan ishonch hosil qilmayapman, lekin bu men.
qo'shib qo'ydi muallif Benedict, manba

Bu turi aloqasi haqida:

Ob'ektga ishlash uchun ob'ektga biriktirilgan funksiya boshqa ob'ekt turlari bo'yicha ishlatilmaydi.

Haskell-da siz sinflari ga qarshi ishlaydigan funktsiyalarni yozasiz - shuning uchun berilgan funktsiyaning har xil turdagi turlari bor, shuning uchun ular berilgan class bu funksiya ishlaydi.

Erkin vazifalar sizning funktsiyalaringizni A turi ichida ishlashga qaratishda odatiy holga tushib qolmasangiz, bunday funktsiyani amalga oshirishga imkon bermaydi, chunki funksiya sizning A tipidagi nusxaga ega bo'lmasa, siz ularni ishlata olmaysiz. aks holda B turi yoki turi C misolida foydalanish uchun etarlicha umumiy bo'lishi kerak.

7
qo'shib qo'ydi
@ Random832 mutlaqo, lekin nima uchun bu ma'lumot turi bilan ishlamaslik uchun ma'lumotlar turi ichida funktsiyani kiritish kerak? Javob: Bu to yagona sababi ma'lumotlar turida funktsiyani joylashtirish. Statik sinflardan tashqari boshqa hech narsa yoza olmaysiz va o'zingizning ixtiyoriy narsalaringizdan butunlay ajralib chiqish uchun ular tarkibida joylashgan ma'lumotlar turiga nisbatan emas, balki funktsiyalarini bajarishingiz mumkin, lekin keyin nima uchun ularni turdagi ? Funktsional yondashuv quyidagicha ifodalanadi: bezovta qilmang, o'zingizning funktsiyalaringizni turli xil interfeyslarga ishlash uchun yozing va keyin ularni ma'lumotlaringiz bilan qamrab olishga hech qanday sabab yo'q.
qo'shib qo'ydi muallif Jimmy Hoffa, manba
@ Random832 interfeyslari ma'lumotlar turlari; ular uchun hech qanday funktsiyalar kerak emas. Bepul funktsiyalar bilan, barcha interfeyslarga qarshi ishlashga mo'ljallangan funktsiyalar uchun qanday ma'lumotlarni taqdim etilishi kerak.
qo'shib qo'ydi muallif Jimmy Hoffa, manba
@ Random832 OOda juda keng tarqalgani kabi haqiqiy ob'ektlar bilan bog'lanish uchun kitobning interfeysi haqida o'ylang: bu ma'lumot (ma'lumotlar) ni taqdim etadi. Sizda sahifalar mavjud bo'lgan toifadagi sinflarga qarshi ishlaydigan bepul funktsiyasi bor, bu funktsiya har qanday kitobga, yangilik varaqalariga, K-Martda poster shingillariga, tabriknomalar, pochta orqali, har qanday narsalar bilan birgalikda ishlaydi. burchak. Agar siz sahifani kitobning bir a'zosi sifatida amalga oshirgan bo'lsangiz, siz qayer-sahifani ishlatishingiz mumkin bo'lgan barcha narsalarni qoldirib ketasiz; faqat pivo uchun PartyFoulExceptionni tashlaydi.
qo'shib qo'ydi muallif Jimmy Hoffa, manba
Bu interfeyslarning barcha nuqtasi emasmi? Funktsiyangizga o'xshash narsalarni ko'rish uchun B va C tipidagi narsalarga ruxsat berish uchun, shuning uchun u bir nechta turdagi operatsiyalarni bajarishi mumkin?
qo'shib qo'ydi muallif Aaron C. de Bruyn, manba
Siz hali interfeyslarni amalga oshirishingiz kerak.
qo'shib qo'ydi muallif Aaron C. de Bruyn, manba
@JimmyHoffa Men nihoyat Funktsional dasturlash haqida nimani angladim deb o'ylayman. Rahmat
qo'shib qo'ydi muallif Mahdi, manba

Java va shunga o'xshash OOP tarkibiy qismlarida misol usullari (bepul funktsiyalar yoki kengaytma usullari kabi) boshqa modullardan qo'shilmaydi.

Bu esa, faqat namuna usullari bilan amalga oshirilishi mumkin bo'lgan interfeyslarni ko'rib chiqayotganda cheklovlarni ko'paytiradi. Turli modullarda interfeys va sinfni aniqlay olmaysiz va keyin ularni uchinchi moduldan birgalikda bog'lash uchun koddan foydalaning. Haskell turidagi sinflar singari, yanada moslashuvchan yondashuv bunga qodir bo'lishi kerak.

4
qo'shib qo'ydi
@jozefg: Mavhum Ma'lumotlarni turlari haqida gapiryapman. Men bu munozarada qanday Algebraik ma'lumotlar turlari uzoqdan bog'liqligini ko'rmayapman.
qo'shib qo'ydi muallif Lawrence B. Crowell, manba
Buni Scala'da osongina qilish mumkin. Men Go'yo bilan tanish emasman, lekin AFAIKni u erda ham qilishingiz mumkin. Ruby'ga moslashtirilgandan so'ng, ba'zi bir narsalarga mos keladigan narsalarni kiritish uchun usullarni qo'shish juda keng tarqalgan. Siz ta'riflagan narsalar, hatto, masofadan OO bilan bog'liq bo'lgan har qanday narsadan ko'ra, yomon mo'ljallangan, bir turdagi tizim kabi ko'rinadi. Fikrlash tajribasi sifatida: Ob'ektlar o'rniga Mavhum Ma'lumotlarni turlari haqida gapirganda, qanday javob berishi mumkin? Men sizning dalilingiz OO bilan aloqasi yo'qligini isbotlaydigan har qanday farqni keltirib chiqarmaydi, deb o'ylamayman.
qo'shib qo'ydi muallif Lawrence B. Crowell, manba
@ JörgWMittag Mening taassurotim shuki, OOPni tanqid qiluvchi ko'pchilik, OOPning Java va shunga o'xshash tillarda qo'llanilgan shaklini tanqidiy sinfi sinf tuzilishi bilan va odatda uslublarga qaratadi. Bu taklifning mening taassurotlari shundaki, u odatdagi usullarni tanqid qiladi va golabning qanday foydalanishi kabi OOPning boshqa lazzatlariga amal qilmaydi.
qo'shib qo'ydi muallif user8669, manba
@ JörgWMittag Cebirsel ma'lumotlar tiplarini nazarda tutgan deb o'ylayman. Va CodeInChaos, Haskell sizning takliflaringizni juda ochiqchasiga tanqid qiladi. U etimsiz misol deb nomlanadi va GHC bo'yicha ogohlantirishlar beradi.
qo'shib qo'ydi muallif jozefg, manba
@CodesInChaos Keyin buni "statik klassga asoslangan OO"
qo'shib qo'ydi muallif jozefg, manba
Agar sizda ikkita A va B modullari mavjud bo'lsa, ular "C" va "Interfeys" ni birlashtiradi va ob'ektni interfeysni kutayotgan F funktsiyasiga o'tkazadi, F qanday ishlaydi? bu Sda? Bitta usul - ikkita modul bo'lmasa ham, "yopishtiruvchi" modulni topishning yagona usuli bu haqida biladigan ob'ektni (ya'ni sariq buyumning ob'ektini)
qo'shib qo'ydi muallif Aaron C. de Bruyn, manba

Ob'ektni yo'naltirish asosan protsedura ma'lumotlaridan ajralmaslik (yoki funksiyali ma'lumotni ajralmaslikka olib keladigan bo'lsa, unda ortogonal muammo bo'lgan yon ta'sirlarni olib tashlash). Bir ma'noda, Lambda Matematikasi eng qadimgi va eng sof ob'ektga asoslangan tildir, chunki u faqat faqat Funktsional Ma'lumotlarni Abstraktini taqdim etadi (chunki funksiyalardan tashqari biron bir konstruktsiya yo'q).

Faqat bitta </​​em> ob'ektining operatsiyalari ushbu ob'ektning ma'lumotlarini tekshirishi mumkin. Hatto bir xil turdagi boshqa narsalar ham buni qila olmaydi. (Ob'ektga asoslangan ma'lumotlar uzatilishi va ma'lumotlar to'plamining asosiy farqlaridan biri: ADT bilan bir xil turdagi ob'ektlar bir-birining ma'lumotlarini tekshirishi mumkin, faqat boshqa turidagi ob'ektlarning vakili yashiringan. )

Bu shuni anglatadiki, bir xil turdagi bir nechta ob'ektlar turli xil ma'lumotlarga ega bo'lishi mumkin. Hatto bir xil ob'ekt turli vaqtlarda turli xil ma'lumotlarga ega bo'lishi mumkin. (Masalan, Scala'da Map s va to'siq ni elementlar soniga qarab bir qator va aralashgan triey o'rtasida almashinadi, chunki juda kichik sonlar qatorida qator qator qatorda qidirish juda kichik sobit omillar tufayli, qidiruv daraxti ichidagi logaritmik qidirishdan tezroq.)

Ob'ektning tashqarisidan, siz qila olmaysiz ma'lumotlarining taqdim etilishini bilmasligingiz kerak. Bu qattiq qarama-qarshilikning qarama-qarshi tomoni .

3
qo'shib qo'ydi
OOP da ichki ma'lumot strukturasini shartlarga qarab o'zgartiradigan sinflar mavjud, shuning uchun ushbu sinflarning ob'ektlariga misollar bir vaqtning o'zida juda ko'p turli xil ma'lumotlarni taqdim etishi mumkin. Asosiy ma'lumotni yashirish va inkassatsiya qilish kerakmi? Xo'sh, Scala-dagi Xarita OOP tilida to'g'ri qo'llanilgan (yashirin ma'lumotlarni yashirish va inkassatsiya) Map sinfidan qanday farq qiladi?
qo'shib qo'ydi muallif Paul Roub, manba
Sizning namunangizda ma'lumotlaringizni sinfdagi accessor funktsiyalari bilan qamrab oluvchi (va shu funktsiyalarni shu ma'lumotlarga mahkam bog'lash), aslida dasturning qolgan qismida ushbu klass namunalarini yumshoq qilib qo'yishga imkon beradi. Siz kotibning markaziy nuqtasini inkor qilasiz - juda chiroyli!
qo'shib qo'ydi muallif GlenPeterson, manba

Ma'lumotlar va funktsiyalar o'rtasidagi sog'lom birlashma yomon emas, chunki har birini har biridan mustaqil ravishda o'zgartirish imkoniga ega bo'lishni istaysiz va sog'lom birlashma buni qiyinlashtiradi, chunki bilmasdan o'zgarib, ikkinchisiga o'zgarish bo'lishi mumkin.

Siz funktsiyaga taqdim etilgan turli xil funktsiyalarni funktsiyadagi hech qanday o'zgarishlarni talab qilmasliklarini va shunga o'xshab, ushbu funktsiya o'zgarishlarini qo'llab-quvvatlash uchun ishlayotgan ma'lumotlarni o'zgartirishga hojat qoldirmasdan funksiyaga o'zgartirish kiritishni istaysiz.

1
qo'shib qo'ydi
Ha, men buni xohlayman. Ammo mening tajribam shuki, ma'lumotlaringizni nosimmetrik bo'lmagan funksiyaga jo'natishingiz kerak, chunki uni aniq ishlashi uchun mo'ljallangan, bu funksiya buzilmoqchi. Men faqatgina turdagi xavfsizlik to'g'risida gapirishni emas, balki funksiyaning muallifi (lar) tomonidan kutilmagan ma'lumotlarning holatini nazarda tutmayman. Funktsiya eski va tez-tez ishlatilsa, yangi ma'lumotlarning oqimlashi mumkin bo'lgan har qanday o'zgarish, hali ishlashga muhtoj bo'lgan ayrim eski ma'lumot formatini buzishi mumkin. Funktsiya va ma'lumotlar bilan ishlash uchun ideal bo'lishi mumkin, bu ajralishning haqiqati qiyin va xavfli bo'lishi mumkin.
qo'shib qo'ydi muallif GlenPeterson, manba