Swift a protected access control

vyvojar

Swift a protected access control
« kdy: 20. 12. 2017, 18:21:42 »
Co si myslíte o tom, že Swift od Applu nemá protected a tedy nelze mít property/metody, které by šlo použít pouze v rámci hierarchie dědičnosti a ne zvenčí?

Četl jsem jeden článek, kde důvod byl asi takový, že v podstatě protected je k ničemu a žádnou ochranu přístupu neposkytuje, protože nikomu nebrání třídu podědit a prvek zveřejnit jako public.
Jenže teď dám příklad, např. třída Thread mívá často nějakou protected metodu run, která je určena pro překrytí a je volána, když se vlákno nastartuje. Ve Swiftu by nic nebránilo tu metodu run zavolat napřímo, což je v podstatě programátorská chyba.

No co si o tom myslíte? Je to ok a prostě brát to tak, že kdo např. v tom výše uveden případě zavolá napřímo tu metodu run, tak je to jeho problém, že to někde failne? Já nevím, nějak se nemůžu rozhodnout, jestli je to správný přístup nebo ne a psát ten kód tak, že i já třeba dřív nebo později udělám fail ve vlastním kódu, že si něčeho nevšimnu a použiju člen, který zvenčí nemám používat a pak budu 2 dny debuggovat nebo mám hledat neustále nějaký berličky, jak to ošetřit tak, aby došlo k nějakýmu fatalerroru, když public člen bude použit z venčí i když jeho sémantika je protected?:D
« Poslední změna: 20. 12. 2017, 21:32:18 od Petr Krčmář »


gll

Re:Swift a protected access control.
« Odpověď #1 kdy: 20. 12. 2017, 19:06:03 »
tu třídu Thread bych rád viděl.

BoneFlute

  • *****
  • 1 639
    • Zobrazit profil
Re:Swift a protected access control.
« Odpověď #2 kdy: 20. 12. 2017, 19:50:34 »
Ano, souhlasím s tím, že protected je k ničemu. (Dokonce ho už nějaký ten pátek v žádném mém kódu nepoužívám.)

Polož si otázku: proč by měl někdo bránit tomu, aby se zavolala metoda run napřímo? Proč není ta třída navržena tak, aby napřímo volat šla?

vyvojar

Re:Swift a protected access control.
« Odpověď #3 kdy: 20. 12. 2017, 20:34:42 »
Ano, souhlasím s tím, že protected je k ničemu. (Dokonce ho už nějaký ten pátek v žádném mém kódu nepoužívám.)

Polož si otázku: proč by měl někdo bránit tomu, aby se zavolala metoda run napřímo? Proč není ta třída navržena tak, aby napřímo volat šla?

Protože konkrétně ten Thread se pouští přes metodu start, ta je veřejná a metoda run má sloužit pro implementaci toho, co má to vlákno provádět. Někdo by si to mohl třeba spléct a zavolat run v domnění, že to pouští to vlákno. Kdyby byla protected, tak by se to nestalo. Mně se to prostě nelíbí.

No jako teoreticky by to mohlo jít tak, že bych úplně upustit od toho klasickýho konceptu, co je vidět skoro všude, ale udělat to spíš tak, že by se vlákno vůbec nedědilo za účelem implementace logiky, co má vykonávat (překrytí nějaká PROTECTED metody), ale že by se tomu vláknu předal nějaký IRunnable nebo něco, který by měl jednu metodu run a ta by se tím vláknem pustila. To by pak bylo zase trochu odklonění spíš směrem k nějaké kompozici. No budu si to muset promyslet a podívat se na nějaký moderný způsoby vývoje v těch nových jazycích. 

vyvojar

Re:Swift a protected access control.
« Odpověď #4 kdy: 20. 12. 2017, 20:38:12 »
tu třídu Thread bych rád viděl.

Je to ten klasický koncept, kdy máš třídu Thread a ta má nějakou metodu run, která se pak volá, když nastartuješ vlákno.
Prostě třeba v tom Swiftu

Kód: [Vybrat]
public class MyThread: Thread
{
  public func run()
  {
     print("Hello from thread!")
  }
}

let thread = MyThread()
thread.start() // toto spusti vlakno a v novem vlakne se provede run()
//thread.run() // TOTO je spatne, to pusti run v aktualnim vlakne, bohuzel nemame protected, takze se tomu neda zabranit


vyvojar

Re:Swift a protected access control.
« Odpověď #5 kdy: 20. 12. 2017, 20:39:13 »
tu třídu Thread bych rád viděl.

Je to ten klasický koncept, kdy máš třídu Thread a ta má nějakou metodu run, která se pak volá, když nastartuješ vlákno.
Prostě třeba v tom Swiftu

Kód: [Vybrat]
public class MyThread: Thread
{
  public func run()
  {
     print("Hello from thread!")
  }
}

let thread = MyThread()
thread.start() // toto spusti vlakno a v novem vlakne se provede run()
//thread.run() // TOTO je spatne, to pusti run v aktualnim vlakne, bohuzel nemame protected, takze se tomu neda zabranit

zapomnel jsem override pro vsimavejsi :)

gll

Re:Swift a protected access control.
« Odpověď #6 kdy: 20. 12. 2017, 20:53:52 »
tu třídu Thread bych rád viděl.

Je to ten klasický koncept, kdy máš třídu Thread a ta má nějakou metodu run, která se pak volá, když nastartuješ vlákno.
Prostě třeba v tom Swiftu

Kód: [Vybrat]
public class MyThread: Thread
{
  public func run()
  {
     print("Hello from thread!")
  }
}

let thread = MyThread()
thread.start() // toto spusti vlakno a v novem vlakne se provede run()
//thread.run() // TOTO je spatne, to pusti run v aktualnim vlakne, bohuzel nemame protected, takze se tomu neda zabranit

myslel jsem nějakou knihovnu, kde je ta metoda protected.

vyvojar

Re:Swift a protected access control.
« Odpověď #7 kdy: 20. 12. 2017, 20:56:47 »
tu třídu Thread bych rád viděl.

Je to ten klasický koncept, kdy máš třídu Thread a ta má nějakou metodu run, která se pak volá, když nastartuješ vlákno.
Prostě třeba v tom Swiftu

Kód: [Vybrat]
public class MyThread: Thread
{
  public func run()
  {
     print("Hello from thread!")
  }
}

let thread = MyThread()
thread.start() // toto spusti vlakno a v novem vlakne se provede run()
//thread.run() // TOTO je spatne, to pusti run v aktualnim vlakne, bohuzel nemame protected, takze se tomu neda zabranit

myslel jsem nějakou knihovnu, kde je ta metoda protected.

Treba http://doc.qt.io/qt-5/qthread.html

BoneFlute

  • *****
  • 1 639
    • Zobrazit profil
Re:Swift a protected access control.
« Odpověď #8 kdy: 21. 12. 2017, 00:29:00 »
Ano, souhlasím s tím, že protected je k ničemu. (Dokonce ho už nějaký ten pátek v žádném mém kódu nepoužívám.)

Polož si otázku: proč by měl někdo bránit tomu, aby se zavolala metoda run napřímo? Proč není ta třída navržena tak, aby napřímo volat šla?

Protože konkrétně ten Thread se pouští přes metodu start, ta je veřejná a metoda run má sloužit pro implementaci toho, co má to vlákno provádět. Někdo by si to mohl třeba spléct a zavolat run v domnění, že to pouští to vlákno. Kdyby byla protected, tak by se to nestalo. Mně se to prostě nelíbí.

No jasně. To známe. Ale já se ptám proč by to tak mělo být řešené? Není to poněkud zbytečně složité? Proč to prostě není v té metodě start?

No jako teoreticky by to mohlo jít tak, že bych úplně upustit od toho klasickýho konceptu, co je vidět skoro všude, ale udělat to spíš tak, že by se vlákno vůbec nedědilo za účelem implementace logiky, co má vykonávat (překrytí nějaká PROTECTED metody), ...
To, že je to vidět skoro všude neznamená, že to je dobře. Já bych klidně tvrdil, že je to prostě špatně :-)

Vykook

  • ***
  • 133
    • Zobrazit profil
    • homepage
    • E-mail
Re:Swift a protected access control
« Odpověď #9 kdy: 21. 12. 2017, 09:40:53 »
Osobně preferuji jízdu na kole bez pomocných koleček, ale proti gustu...

vyvojar

Re:Swift a protected access control.
« Odpověď #10 kdy: 21. 12. 2017, 10:14:00 »
Ano, souhlasím s tím, že protected je k ničemu. (Dokonce ho už nějaký ten pátek v žádném mém kódu nepoužívám.)

Polož si otázku: proč by měl někdo bránit tomu, aby se zavolala metoda run napřímo? Proč není ta třída navržena tak, aby napřímo volat šla?

Protože konkrétně ten Thread se pouští přes metodu start, ta je veřejná a metoda run má sloužit pro implementaci toho, co má to vlákno provádět. Někdo by si to mohl třeba spléct a zavolat run v domnění, že to pouští to vlákno. Kdyby byla protected, tak by se to nestalo. Mně se to prostě nelíbí.

No jasně. To známe. Ale já se ptám proč by to tak mělo být řešené? Není to poněkud zbytečně složité? Proč to prostě není v té metodě start?

No jako teoreticky by to mohlo jít tak, že bych úplně upustit od toho klasickýho konceptu, co je vidět skoro všude, ale udělat to spíš tak, že by se vlákno vůbec nedědilo za účelem implementace logiky, co má vykonávat (překrytí nějaká PROTECTED metody), ...
To, že je to vidět skoro všude neznamená, že to je dobře. Já bych klidně tvrdil, že je to prostě špatně :-)
Jak by si to chtel udelat? Ty musis nativnimu vlaknu nejak rict, co se ma zavolat v tom novem vlakne - ocekava pointer na funkci, ktera prijima jeden void parametr a tu funkci pak zavola s parametrem, ktery ty predas. Takze treba na posixu volam nejakou nativni funkci pthread_create a jako tu startup rutinu predavam statickou metodu Thread._start a parametr tu instanci Thread. Ve _start pak pretypuju void* na Thread a zavolam _startImpl, ten provede nejaky setup a zavola run:).

podhy

Re:Swift a protected access control.
« Odpověď #11 kdy: 21. 12. 2017, 11:03:48 »
Ano, souhlasím s tím, že protected je k ničemu. (Dokonce ho už nějaký ten pátek v žádném mém kódu nepoužívám.)

Polož si otázku: proč by měl někdo bránit tomu, aby se zavolala metoda run napřímo? Proč není ta třída navržena tak, aby napřímo volat šla?

Protože konkrétně ten Thread se pouští přes metodu start, ta je veřejná a metoda run má sloužit pro implementaci toho, co má to vlákno provádět. Někdo by si to mohl třeba spléct a zavolat run v domnění, že to pouští to vlákno. Kdyby byla protected, tak by se to nestalo. Mně se to prostě nelíbí.

No jasně. To známe. Ale já se ptám proč by to tak mělo být řešené? Není to poněkud zbytečně složité? Proč to prostě není v té metodě start?

No jako teoreticky by to mohlo jít tak, že bych úplně upustit od toho klasickýho konceptu, co je vidět skoro všude, ale udělat to spíš tak, že by se vlákno vůbec nedědilo za účelem implementace logiky, co má vykonávat (překrytí nějaká PROTECTED metody), ...
To, že je to vidět skoro všude neznamená, že to je dobře. Já bych klidně tvrdil, že je to prostě špatně :-)
Jak by si to chtel udelat? Ty musis nativnimu vlaknu nejak rict, co se ma zavolat v tom novem vlakne - ocekava pointer na funkci, ktera prijima jeden void parametr a tu funkci pak zavola s parametrem, ktery ty predas. Takze treba na posixu volam nejakou nativni funkci pthread_create a jako tu startup rutinu predavam statickou metodu Thread._start a parametr tu instanci Thread. Ve _start pak pretypuju void* na Thread a zavolam _startImpl, ten provede nejaky setup a zavola run:).

budu předávat funkci start anonymní funkci, která se bude v tom vláknu / vlákench vykonávat?

gll

Re:Swift a protected access control.
« Odpověď #12 kdy: 21. 12. 2017, 11:18:52 »
budu předávat funkci start anonymní funkci, která se bude v tom vláknu / vlákench vykonávat?

nemusí být anonymní. Dědění je v tomto případě úplně zbytečné.

podhy

Re:Swift a protected access control.
« Odpověď #13 kdy: 21. 12. 2017, 11:44:17 »
budu předávat funkci start anonymní funkci, která se bude v tom vláknu / vlákench vykonávat?

nemusí být anonymní. Dědění je v tomto případě úplně zbytečné.

jo jasný...tady už je to i v závislosti na jazyku, kterej použiju, ale dědičnost mi tady taky rozhdoně nepřijde nutná spíš zbytečná

.

Re:Swift a protected access control.
« Odpověď #14 kdy: 22. 12. 2017, 07:53:34 »
budu předávat funkci start anonymní funkci, která se bude v tom vláknu / vlákench vykonávat?

nemusí být anonymní. Dědění je v tomto případě úplně zbytečné.

jo jasný...tady už je to i v závislosti na jazyku, kterej použiju, ale dědičnost mi tady taky rozhdoně nepřijde nutná spíš zbytečná
Dědičnost je zbytečná skoro vždy.