get/ set method vs public variable

70 отговора 2413 прегледа
#1

get/ set method vs public variable

какво е по добре да се ползва
гет/сет методи или направо публик променливи

намерих ето това нещо сас гоогле-а и като гледам май нещата повече клонят кам гет/сет макар че има подразници и на променливите

[линк]

та какво е васто мнение по вапроса

Отговор
в отговор на KpyM #2

Re: get/ set method vs public variable

Догмата май клони към гет/сет методи. Което е жалко, защото лично съм наблюдавал безумия с изобилие от гет/сет двойки, където прост публичен член би свършил по-добра работа.

Мисля си, че гет и сет методите са за страхливи "програмисти", които програмират дефанзивно и ги слагат само от страх, че видиш ли, някога ще им се наложи да правят нещо при достъп до променливата. Може би е редно да осъзнаем, че ако промяната в такъв случай е трудна то много неща ще да са били осрани преди това и проблема не са гет/сет методите.

Това е моментно хрумване. Някой да иска да ме опровергае?

--
Екстремно програмиране на български.
[линк]
Отговор
в отговор на Дeшeв #3

Re: get/ set method vs public variable

ми като се има предвид, че и пропертитата скриват именно това дали има get/set методи или директно присвояваш на променлива...

Сигнатура!
Отговор
в отговор на Дeшeв #4

Re: get/ set method vs public variable

като почнеш да пишеш юнит-тестове 70% от времето, ще осъзнаеш че оверрайдването на гетерите и сетерите е вълшебно.. ;-)

Отговор
в отговор на KpyM #5

Re: get/ set method vs public variable

според мен използването на публични променливи води до много по-четлив код, ако пропертиес беше част от стандарта нямаше изобщо да има 2 мнения по въпроса

Отговор
в отговор на purist #6

Re: get/ set method vs public variable

"като почнеш да пишеш юнит-тестове 70% от времето"

:)) хехе, т'ва е дефиниция на 'да продаваш краставици на краставичар'

Отговор
в отговор на Questor #7

Re: get/ set method vs public variable

Абе аз предпочитам get/set пред property - виждам, че достъпвам контролирана променлива. Пък и ми е индикатор за лош код - като започнат да се натрупват повече, класа се е превърнал в проста торба и не е лошо да се преосмисли.

Отговор
в отговор на ~!@$%^amp;*()_+ #8

Re: get/ set method vs public variable

То е част от стандарта...ма на C# и Delphi :)

Отговор
в отговор на Дeшeв #9

Re: get/ set method vs public variable

Ако го гледаш от страна на пълна енкапсулация - естествено, че ще ползваш get/set методи - най-малкото ти позволяват транспарентно да променяш/добавяш функционалност - излишно е да обяснявам защо това е яко, нали? Това което ти наричаш страх, аз му викам future proofing.

Отговор
в отговор на purist #10

Re: get/ set method vs public variable

Овъррайдвам гет/сет методи и пропъртита почти само като работя с брутален legacy код. Техниката е добра за опитомяване на такива дзверове.

Предположение: като си пишеш тестовете след кода си в същата ситуация, на която викам legacy по-горе . Говоря за изтърван и неконтролируем код, който се опитваме да вържем с тестове.

--
Екстремно програмиране на български.
[линк]
Отговор
в отговор на gruhal #11

Re: get/ set method vs public variable

Предпочитам други future proofing методи, които не ми осират кода с безсмислени функции от типа:

Whatever GetSomething()
{
return this.someThing;
}

Ако ми затрябва такава функция в бъдещето защо просто да не си я добавя като видя истинската нужда?

Предпочитам и да избягвам презастрахования за бъдещето без да има реална нужда от тях.

--
Екстремно програмиране на български.
[линк]
Отговор
в отговор на gruhal #12

Re: get/ set method vs public variable

Има ги и в python, ВБ и Ruby (за третото не съм на 100% сигурен, но ме мързи да проверявам).

--
Екстремно програмиране на български.
[линк]
Отговор
в отговор на Дeшeв #13

Re: get/ set method vs public variable

И като я добавиш, какво получаваш:

SetSometing();
someThing;

за да не ти се строши стария code

или махаш someThing (което може и да е наложено от промени в структурите на данните отдолу) и почваш да рефакторваш като обезумял.

Anyways, разни хора, разни идеали - едва ли има смисъл от дискусии кой code е по-хубав - има си coding standards по фирмите и тва е :)

Редактирано от gruhal на

Отговор
в отговор на Дeшeв #14

Re: get/ set method vs public variable

не знаех, нямам сблъскване с тях, да са живи и здрави :)

Отговор
в отговор на Дeшeв #15

Re: get/ set method vs public variable

Ами едно нещо дето и иде на ума е, че примерно DataBinder не ще да байндва публични мембъри, а само публични пропъртита... Ако го ползваш с custom class а не с DataTable няма да минеш без аксесори. Ама пък от друга страна това го забелязах като реших да правя изгъзици с DataBinder - сега не ме кефи да го ползвам и нямам проблем, но си пиша аксесорите все пак :)

Powered by telerik fuel. Sometimes by vodka.
Отговор
в отговор на KpyM #16

Re: get/ set method vs public variable

Ми няма универсално решение, според случая!
Персонално, ако стигна до момента за добавяне на метода:
int AAA::Get() const
{
return iii;
}
Първия въпрос, който си задавам, е "Защо по дяволите ще искам да давам на някого достъп до iii, по този начин разкривайки детайли от имплементацията?" И тръгвам от точката, че дизайна явно куца, и гледам да избягна въобще get/ set двойката.
==============
Ако класа е интерфейсен - почти 100% get/ set ще изчезне.

Отговор
в отговор на KpyM #17

Re: get/ set method vs public variable

Изборът е според вкуса на програмиста. Използуването на public променлива ще намали малко обема на кода, и това решение е по - добро ако имаш малко такива променливи. Но ако променливите са повече ти препоръчвам да използуваш get/set механизъм. Изпълването на клас с голям брой public променливи не е особено стабилен код и може да доведе до грешки.

Отговор
в отговор на purist #18

Re: get/ set method vs public variable

като стана дума за юнит тестове - абе как културно да проверя от тест някой private member на клас дето тествам?

друго - ползвате ли някакъв генератор на стъбове - или оверрайдвате гетерите и сетерите за тая цел?

Сигнатура!
Отговор
в отговор на Questor #19

Re: get/ set method vs public variable

Ако става въпрос за C++. Ако класа който искаш да тестваш се казва TClass с header "Class.h" - в тест cpp файла, дето правиш
#include "Class.h"
сложи един
#define private public
преди #include "Class.h"
Може да помогне, но не съм сигурен.
------------------------
Втори начин:
Пак искаш да тестваш TClass. Имаш тестов клас TTestClass.
В декларацията на на TClass правиш:
friend class TTestClass;
Но пък неудобството е пипането в production header-a на
TClass.

Отговор
в отговор на ZZ #20

Re: get/ set method vs public variable

Или 3-ти вариант:
В класа TClass, който искаш да тестваш, слагаш метод от типа на
"void SelfTest()", който има non-default имплементация само в тестова среда.
Но тоя метод не е много добър по понятни причини.
Или 4-ти вариант:
Директно в unit test project-a включваш source files na TClass - пак не много добре.

Отговор