Кіріспе

Жалпы жинақ туралы мақала. Объект жинағы – бұл бағдарламалық жасақтаманы құрудың жобалық үлгісі, ол сұраныс бойынша жадтан бөліп беру және жою орнына, пайдалануға дайын, бастамаланған объектілер жиынтығын – "жинақ" – пайдаланады. Жинақтың пайдаланушысы жинақтан объект сұрап алып, қайтарылған объектімен операциялар орындайды. Пайдаланушы жұмысын аяқтағаннан кейін, оны жоюдың орнына жинаққа қайтарады; бұл қолмен немесе автоматты түрде жасалуы мүмкін. Объект жинақтары негізінен өнімділікті арттыру үшін қолданылады: кейбір жағдайларда объект жинақтары өнімділікті едәуір жақсартады. Объект жинақтары объектінің өмірлік циклын күрделендіреді, себебі жинақтан алынған және жинаққа қайтарылған объектілер сол уақытта нақты құрылмайды немесе жойылмайды, сондықтан іске асыру кезінде сақтық қажет.

Сипаттама

Егер көптеген объектілермен жұмыс істеу қажет болса, оларды құру өте қымбатқа түсетін болса және әрбір объект қысқа мерзімге ғана қажет болса, бүкіл қолданбаның өнімділігіне кері әсер етуі мүмкін. Мұндай жағдайларда объектілер жиынтығын пайдалану үлгісі тиімді болуы мүмкін. Объектілер жиынтығын пайдалану үлгісі қайта пайдалануға болатын объектілер жиынтығын құрайды. Жаңа объект қажет болған кезде, ол жиынтықтан сұралады. Егер бұрыннан дайындалған объект қолжетімді болса, ол дереу қайтарылады, осылайша құру шығындарынан аулақ боласыз. Егер жиынтықта ешқандай объект болмаса, жаңа элемент құрылып қайтарылады. Объект пайдаланылғаннан кейін және енді қажет болмағанда, ол жиынтыққа қайтарылады, бұл оны болашақта есептеу ресурстарын көп қажет ететін құру процесін қайталамай пайдалануға мүмкіндік береді. Объект пайдаланылып, қайтарылғаннан кейін, бұрынғы сілтемелер жарамсыз болатынын ескеру маңызды. Кейбір объектілер жиынтықтарында ресурстар шектеулі болып, объектілердің максималды саны көрсетіледі. Егер бұл санға жетілсе және жаңа элемент сұралса, қателік туындауы мүмкін немесе жиынтыққа объект қайтарылғанша өтініш күтіп тұруға түсуі мүмкін. Объектілер жиынтығын пайдалану үлгісі .NET Framework стандартты сыныптарында бірнеше жерде қолданылады. Мысалы, SQL Server үшін .NET Framework деректер провайдерін қарастыруға болады. SQL Server деректер қорына қосылымдарды құру уақытты қажет ететіндіктен, қосылымдар жиынтығы сақталады. Қосылымды жабу SQL Server-мен байланысты үзуге әкелмейді. Керісінше, қосылым жиынтықта сақталады және жаңа қосылым сұралған кезде одан алынуы мүмкін. Бұл қосылымдарды құру жылдамдығын едәуір арттырады.

Артықшылықтары

Объекттерді біріктіру сынып инстанциясын бастау құны жоғары және сыныпты құру мен жою жылдамдығы жоғары жағдайларда өнімділіктің айтарлықтай артуын қамтамасыз етеді. Мұндай жағдайларда объектілерді жиі қайта пайдалануға болады, әр пайдалану да уақытты үнемдейді. Объекттерді біріктіру ресурстарды – жадты және мүмкін басқа ресурстарды, мысалы, желілік сокеттерді қажет етеді, сондықтан бір уақытта қолданыстағы инстанциялар саны аз болғаны жөн, бірақ бұл міндетті емес. Біріктірілген объектіні болжамды уақытта алуға болады, ал жаңа объектіні құру (әсіресе желі арқылы) өзгермелі уақытты қажет етеді. Бұл пайдалар көбінесе уақыт бойынша қымбат объектілерге қатысты: деректер қоры байланыстары, сокет байланыстары, жіптер және қаріптер немесе биттік карталар сияқты үлкен графикалық объектілер. Басқа жағдайларда, қарапайым объекттерді біріктіру (сыртқы ресурстарды ұстамайтын, тек жадты ғана пайдаланатын) тиімді болмауы және өнімділіктің төмендеуіне әкелуі мүмкін. Егер жай жадты біріктіру болса, жадты бөлуді басқарудың плиткалық әдісі көбірек қолайлы, себебі мақсат жадты бөлу және босату құнын фрагментацияны азайту арқылы төмендету болып табылады.

Іске асыру

Объекттер тоғандарын C++ сияқты тілдерде смарт-көрсеткіштер арқылы автоматты түрде жүзеге асыруға болады. Смарт-көрсеткіштің конструкторында объектіні тоғаннан алуға болады, ал деструкторында – тоғанға қайтаруға болады. Қоқыс жиналатын тілдерде, онда деструкторлар жоқ (және олар стек аяқталу кезінде шақырылатынына кепілдік берілмейді), объектілер тоғандарын қолмен жүзеге асыру қажет, фабрикадан объектіні нақты сұрап, оны жою әдісін шақыру арқылы қайтару керек (жою үлгісі бойынша). Бұл үшін финализаторды пайдалану жақсы емес, себебі финализатордың қашан (немесе бола ма) орындалатынына кепілдік жоқ. Оның орнына, объектіні алу және босату операциялары қателікке қарсы тұратынын қамтамасыз ету үшін "try-finally" блогын қолдану керек. Қолмен басқарылатын объектілер тоғандарын жүзеге асыру оңай, бірақ оларды пайдалану қиын, өйткені тоғандағы объектілердің жадын қолмен басқаруды талап етеді.

Бос бассейндерді пайдалану

Объекттер тобында бос объектілер болмаған жағдайда сұранысты өңдеу үшін үш стратегияның бірі қолданылады. Объектіні беруден бас тарту (және клиентке қате жіберу). Жаңа объектіні бөлу, осылайша топтың мөлшерін арттыру. Мұндай топтар көбінесе жоғары шекті (ең көп пайдаланылатын объектілер саны) орнатуға мүмкіндік береді. Көп тірістік ортада, топ клиентті басқа тіріс объектіні топқа қайтарғанша күтуге мәжбүрлей алады.

Қаттылықтар

Пулға қайтарылған нысандардың күйі объектіні келесі қолдану үшін лайықты жағдайға келтірілуін қамтамасыз ету үшін көңіл бөлу керек, әйтпесе объект клиент күткендей болмай, жұмысын тоқтатуы мүмкін. Объектілерді қалпына келтіруге жауапты – пул, клиенттер емес. Қауіпті ескірген күйі бар нысандарға толы пулдар кейде «нысан тоғандары» деп аталады және олар дұрыс емес тәсіл саналады. Ескірген күй әрқашан мәселе тудырмайды; ол объектінің күтпеген әрекетін тудырғанда ғана қауіпті болады. Мысалы, аутентификация деректерін ұсынатын объект, егер «сәтті аутентификацияланды» деген белгі қайта пайдаланудан бұрын қалпына келтірилмесе, қате жұмыс істеуі мүмкін, себебі ол пайдаланушының аутентификацияланғанын (мүмкін, басқа біреу ретінде) көрсетеді, ал шындығында ол аутентификацияланбаған. Дегенмен, тек қана түзету үшін қолданылатын мәнді қалпына келтірмеу, мысалы, соңғы пайдаланылған аутентификация серверінің идентификаторы, ешқандай мәселе тудырмауы мүмкін. Нысандарды тиісінше қалпына келтірмеу ақпараттың жасырынып кетуіне әкелуі мүмкін. Құпия деректерді (мысалы, пайдаланушының кредиттік карта нөмірін) сақтаған нысандар жаңа клиенттерге жіберілгенге дейін тазалануы керек, әйтпесе деректер рұқсатсыз тұлғаға ашылуы мүмкін. Егер пул бірнеше жіптермен қолданылса, онда бірнеше жіптің бірдей нысанды бір уақытта пайдалануына жол бермеу үшін қажет құралдар болуы мүмкін. Бұл пулға алынған нысандар өзгертілмейтін немесе жіптерге қауіпсіз болса қажет емес.

Сын

Кейбір басылымдар, әсіресе жадыны ғана пайдаланатын және сыртқы ресурстарды (мысалы, деректер қорымен байланыс) ұстамайтын объектілер үшін, Java сияқты белгілі бір тілдерде объектілерді қайта пайдалануды (object pooling) ұсынбайды. Қарсыластардың пікірінше, қазіргі заманғы қоқыс жинағыштары бар тілдерде жаңа объектілерді құру салыстырмалы түрде жылдам; `new` операторына ондай команда ғана жеткілікті болса, ал қайта пайдалану схемаларындағы классикалық `new`-`delete` жұбына жүздеген командалар қажет, себебі ол күрделірек жұмыс атқарады. Сонымен қатар, көптеген қоқыс жинағыштар объектілердің мазмұны үшін пайдаланатын жадыны емес, "тірі" объектілерге сілтемелерді тексереді. Яғни, сілтемесі жоқ "өлі" объектілердің кез келген санын аз шығынмен жоюға болады. Керісінше, көптеген "тірі", бірақ пайдаланылмаған объектілерді сақтау қоқыс жинау процесінің уақытын ұзартады.