Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Logik

Stran: 1 ... 61 62 [63] 64 65 ... 68
931
Vývoj / Re: Optimální algoritmus výpočtu
« kdy: 24. 10. 2010, 20:36:08 »
Citace
Já používám větu o definici rekurzi....
Mě se zdá, že v každym postu používáš něco jinýho. Nejdřív si tvrdil, že používáš  matematickou indukci bez pevnýho bodu, pak zas že indukci nepoužíváš vůbec, pak užíváš omezenou transfinitní indukci, potom zas větu o definici funkce rekurzí.

Jinak ano, pomocí věty o definici rekurzí ten algoritmus jde dokázat taky (a je to vcelku hezký důkaz, asi i kratší než s použitím MI). Pro korektnost tam zas musíš definovat dobré uspořádání - takže taky je tam ještě nějaká práce, kterou neděláš u MI. A btw. to uspořádání Ti definuje nejmenší člen a ten je pak pevným bodem.
Nicméně je to jiný důkaz a tedy nevypovídá nic o tom, zdali pro důkaz pomocí MI potřebuješ pevný bod či nikoli.

Citace
Při důkazu verzí bez pevného bodu implikace "(a = a - 1) =>  ((a+1) = (a+1) - 1)" pro a=0 nefunguje, protože a nemá předchůdce. Takže žádný problém.
A co když to tvrdím na celých číslech? Tam každé číslo předchůdce má... Naopak právě to, že na celých číslech to nefunguje je důkaz toho, že potřebuješ nějaký pevný bod. Celá indukce funguje tak, že vezmeš nějakej pevnej bod, kde to tvrzení platí a pomocí indukčního kroku infikuješ platností ostatní.

 To, že teorie množin popisuje aritmetiku ještě neznamená, že se při používání výsledků TEMNA nemusí dbát jisté opatrnosti na to, jak se aplikuje. Proto je imho jednodušší dokazovat pomocí MI, kde máš větu s naprosto jasným mustrem důkazu.

TI říká pouze něco o vlastnostech přirozených čísel, MI rozvnou o tvrzeních, aplikovaných na ně. Takže pokud chceš užít TI (respektive navíc omezenou na přirozená čísla, což si vyžádá další práci navíc) musíš kus toho, co je ve větě o MI již dokázaný dokázat ručně. V rámci toho se Ti může stát, že dokážeš i platnost tvrzení v pevném bodě (ten tam opět je, ani TI by nefungovala bez pevného bodu - tzn. bez tvrzení, P(n_0), které lze dokázat bez předpokladu P(n)).
 To však neznamená, že Ti to ušetří práci, ani že tam ten pevný bod není (právě předpoklad uspořádání množiny je v podstatě ekvivalentní předpokladu existence pevného bodu).

PS: Jinak existenci f ověřovat nemusím, protože P existuje, dokážu-li tedy ekvivalenci P a f, musí existovat i f.

jaromir: :-) :-) Ne, tys jen postoval myšlenkově nejjednodušší algoritmus kterej je pomalej a tak ostatní nezajímá.... Ale jasně, seš king...

ferren: rozdíl v akademickém a praktickém přístupu je v tom, že zatímco akademici se dokážou bavit, tak "praktici" všechno počítaj na peníze? Sice nejsem čistej akademik, ale jestli to tak je, tak se na ten doktorát určitě přihlásim...

932
Vývoj / Re: Definice časové složitosti
« kdy: 20. 10. 2010, 17:20:01 »
No ale přeci když tam budou samé jedničky, tak je prostě setřídíš v čase nlog(n), ne?

IMHO máš chybu v tom, že převedení na binární soustavu nezkrátí logaritmicky vstup. Vstup se zkrátí jen na délku cca
log(n/m)*m
Přesně to bude pokud budou čísla stejně dlouhá, což vzhledem k tomu, že si pro dané n mohu vybrat "nejhorší vstup" mohu zaručit (nebo asi spíš skoro zaručit až na nějakou nepodstatnou konstantu)
log(n/m)*m =  log(n)*m - log(m)*m < 1/2 log(n)*m = omega(log(n)*m)
pokud tedy m * log(n) > n,

Jelikož vstupy, kde
m = C * n/log(n)
existují, tak existjí vstupy délky n, pro které bude pořád složitost n log (n).
Nebo dělám někde chybu?

933
Vývoj / Re: Definice časové složitosti
« kdy: 20. 10. 2010, 15:28:57 »
host: Než co?
j:
O složitostí myslím prostě takovou tu s omega se zanedbáním konstant. :-)

Citace
Jses si jist, ze chces aby F melo mensi slozitost nez B
U F myslím ano, u G by ji to chtělo definovat v závisloti na velikosti nikoli vstupu G, ale vstupu algoritmu....

Citace
F je linearni, G je exponencialni.
Právě kvůli tomudle.

Ty podmínky mají v podstatě vyjádřit. B řeší A do té doby, dokud pre/postproces řešení B není náročnější než samotné řešení B.

Citace
B je linearni (dokonce pravdepodobne sublinearni),
IMHO není lineární. Lineární je vzhledem k růstu čísla, ale nikoli vzhledem k růstu počtu čísel. Takže je furt taky nlog(n). Nebo se pletu?

Citace
A prave diky existenci polynomialni redukce mezi vsema NP-uplnyma problemama ti vsechno spadne do jedne tridy...
Jen všechny NP úplné. A to mi zas tak nevadí, svým způsobem to je vlastně jeden a ten samý problém, jen s jinou "omáčkou".

Citace
Chces davat dokupy problemy z ruznych slozitostnich trid,
Nechci. Problém batohu za danejch podmínek na problém setřídění nepřevedeš. A problém setřídění na problém batohu asi nějak půjde, ale zas daný problém pak zařadím do "minimální" možné třídy, tzn. vyberu ten podobný algoritmus, který má nejmenší složitost.
Jinými slovy, třídění přímým výběrem je podobné heapsortu, ale obecně problém třídění (jemuž jsou podobné oba tyto algoritmy) zařadím do nlogn, protože jsem schopen najít podobný algoritmus, který to v nlog(n) řeší.

Citace
a v principu nevidim rozdil mezi "konverzii" vstupu/vystupu, kterou jeste intuitivne povazujes za rozumnou a vsema dalsima.
Právě proto tam mam podmínku, že konverze musí bejt jednodušší než algoritmus samotný.

934
Vývoj / Re: Optimální algoritmus výpočtu
« kdy: 20. 10. 2010, 14:47:26 »
Citace
Matematickou teorii, ve které se definuje algoritmem, bohužel neznám
Nevím, co se snažíš dokázat Ty, ale já dokazuju platnost algoritmu. Čili dokazuji, že funkce f, kterou vyčísluje ten algoritmus, je ekvivalentní s funkcí P.
Pokud dokazuješ něco o nějaké jiné funkci definované nějakou rekurkzí, můžeš, ale pak nechápu proč to děláš v tomto vlákně, tady je debata o důkazu algoritmu a tedy o funkci definované tímto algoritmem.

Jinak jestli nevíš, co je to fce definovaná algoritmem, tak to je Tvůj problém. Např. se dá definovat jako funkce, která jedefinovaná na množině vstupů algoritmu, pro který algoritmus doběhne a hodnota funkce pro daný vstup je výsledek algoritmu.

Druhá možnost jak definovat funkci pomocí algoritmu konstrukční: přes ekvivalenci TS a rekurzivně vyčíslitelných funkcí. Tzn. funkce definovaná algoritmem je taková funkce, která je ekvivalentní TS implementujícímu daný algoritmus.

Ať to uděláš jak checš, v každym případě musíš dokazovat něco o funkci, která je počítaná tak, jak počítá ten algoritmus. Takže tak funkce je tím algoritmem definovaná.

Citace
Potíž je v tom, že definice rekurzí/algoritmem nemusí být definována korektně - zaměn v definici třeba "a+b" za "a-b", a máš zásadní problém.
Ano máš problém. Budeš totiž dokazovat tvrzení, které s algoritmem nesouvisí. No a?
Popř. pokud by v algoritmu bylo a-b, tak by důkaz prostě nešel provést - což neni divu, protože by algoritmus nefungoval...
Nebo (v tomto případě) dokážeš z definice funkce spor. A tak dokážeš, že taková fce neexistuje. No a?

Citace
tak vidím, že v důkazu nemá P co dělat (P je takto použito v Lemmatu a sám jsi uznal, že pro Lemma indukce není třeba), na jeho místě má být f.
Ach jo. Tak znova. Dokazuji, že P(a) = f(a). Tak jaktože v důkazu nemá P(a) co dělat??

f(a) je definována jako
f(n) = min (f(i)+ f(j) ....)
protože tak vyčísluje tu funkci algoritmus.

Abych T(n) dokázal, tak
1) použiji indukční předpoklad, že f(k) = P(k) pro všechna f(k) v definici f(n) a tedy
f(n) = min (f(i)+ f(j) ....) = min (P(i)+ P(j)...)
2) použiju Lemma, že min (P(i)+ P(j)...) = P(n)
f(n) = min (f(i)+ f(j) ....) = min (P(i)+ P(j)...) = P(n)
      ◻   

Citace
Je-li M podmnožina N_0 taková, že pro každé x platí: x je podmn. M => x je prvkem M (toto je "indukční krok") pak M = N_0.
Teorii množin tolik neumim, ale to, co popisuješ je co vím modifikované tvrzení o
transfinitní indukci a nikoli o MI. Takže
1) to co popisuješ IMHO není matematická indukce
2) M podle předpokladu obsahuje sama sebe a tedy obsahuje prvek: množinu všech přirozených čísel. Množina všech přirozených čísel je první nekonečno. Takže prvkem M je nekonečno a tedy M není podmnožina N_0. Spor.

Tzn. žádná taková M neexistuje a toto tvrzení není ani matematická, ani transfinitní ani jiná indukce ale tvrzení o ničem.

Citace
To, že pevný bod dále nepoužiješ, tě netrápí: naučil ses, že indukce vyžaduje pevný bod.
Hele já asi končím. Todle nemá cenu. Prostě existuje věta o matematické indukci s danými předpoklady. Pokud někdo používá důkaz MI, znamená to (alespoň mezi všema lidma na MFF, co jsem se zatím setkal), že aplikují danou větu. V předpokladech MI je existence pevného bodu. Takže buď použiju větu o MI a musím dokázat tvrzení pro pevný bod, nebo nepoužiju větu o MI - ale pak nedokazuju matematickou indukcí. Žádná jiná možnost prostě není.

Btw. i v Tvém důkazu je vlastně pevný bod. Tvrdíš, že pro P(1) nepotřebuješ předpoklady. Jenže to je třeba taky dokázat (byť je to taky vcelku trivoš). Tím ale přistupuješ k P(1) jinak než ke všem ostatním. Takže také používáš pevný bod. A navíc protože nedokazuješ explicitně P(n_0) nemůžeš použít větu o MI, takže asi používáš nějakou svojí indukci. a tu bys měl dokázat.

Ono to totiž bez pevného bodu to nejde! Např platí   (a = a - 1) =>  ((a+1) = (a+1) - 1). To ale neznamená, že a = a - 1. Proto je pevný bod pro MI nutnost. Ona i ta věta o transfinitní indukci se pak musí užít s pevným bodem:
http://mathworld.wolfram.com/TransfiniteInduction.html

Citace
Pokud máš nějaké konkrétní výhrady k mému důkazu (kromě toho, že si pletu dojmy s pojmy),
Nesouhlasím s tím, že pokud
f(n) = min (f(i)+ f(j) ....)
pak tvrzení
P(n) = f(n) plyne okamžitě Lematu, aniž bys použil MI (popř. postup MI podobný). Pokud nesouhlasíš, tak to formálně dokaž.

PS: Co se týče mojeho matematického vzdělání, doporučil bych Ti se krotit, by ses neztrapnil.... :-) Ale to jen tak na okraj.... :-)

935
Software / Re: Oracle connect c++ / Linux
« kdy: 20. 10. 2010, 11:28:36 »
A exportuješ to $ORACLE_HOME? Zkus si ho vypsat přímo v programu....

I když to by asi nefungovali i ty ostatní programy, takže beru zpět.... No ale za vyskoušení nic nedáš :-)

936
Vývoj / Re: Definice časové složitosti
« kdy: 20. 10. 2010, 11:26:37 »
nevim: Bc. mff informatika, studium hotový, píšu diplomku.

j: Jo, já s tebou souhlasim. Akorát si myslím, že by ty "problémový třídy definovat možná šly".

Citace
A stavet podobnost na tom, ze se ti to intuitivne zda, resp. zadani v prirozenem jazyce zni podobne... - no, nic moc ;)
Souhlasím, pokud to nepůjde definovat formálněji, tak je to blbina :-).

Zkusil bych třeba:
Algoritmus A je podobný algoritmu B, pokud.
Existuje  funkce F: vstupy(B) -> vstupy(A) a G: výstupy(A) -> výstupy(B), které jsou
a) na
b) Pro každé b ze vstupů b platí B(b) = G(A(F(b)))
c) O složitost (tzn. se zanedbáním konstant) F a G je asymptoticky menší nebo rovna složitosti algoritmu B.

Máš pravdu, že tak by se dostali všechny NP do jedné třídy, to mě nenapadlo :-),
ono vlastně to říká, které algoritmy jsou schopny navzájem řešit své zadání.
Možná ještě zajímavější by bylo, kdyby G byla identita (tzn. vstup různý, ale požadavek na stejný výstup). Nicméně u rozhodovacích problémů se rozdíl stírá.

Největší problém, kterej v tomdle vidim je ten, že ta relace mezi algoritmama dosti pravděpodobně nebude tranzitivní (složením převodů už vzinkne tak složitej převod, že nevyhoví definici) a možná ani symetrická. Takže jde spíše o relaci, kdy ke aždému problému existuje množina "podobných problémů".

Nicméně i tak se mi zdá k něčemu - říká mi, v jakých formátech mohu příjmat vstup, abych pořád byl stejně rychle schopen vyřešit daný problém* a naopak jaké algoritmy mohu použít pro řešení daného problému (i když to je svým způsobem nadbytečná definice, protože G*A*F je taky algoritmus.

*) problém teď chápu jako ryze praktickou věc - prostě potřebuju něco vyřešit, co mám zadaný per huba. Tak najdu libovolný řešící algoritmus, k němu množinu podobných algoritmů a z ní si vyberu.

Ale stopro todle promyšlený nemam, neručim ,že tam neni někde díra :-)

937
Vývoj / Re: Definice časové složitosti
« kdy: 19. 10. 2010, 11:50:27 »
Jen dvě technické
1) imho u složitosti algoritmu má smysl se bavit o složitosti vzhledem k optimálnímu vstupu - tzn. zadaném v co nejúspornějším formátu. To sice zrovna příliš formalizovatelné asi není (různé komprese mohou zúspornit i na pohled nejúspornější formát), nicméně pro porovnávání náročnosti různých algoritmů je to myslím dostačující definice.
(Zformalizovat by to šlo např. tak, že pokud algoritmus A při svém běhu ignoruje hodnotu některých bitů na vstupu, pak existuje A', který příjmá stejný vstup s těmi bity vypuštěnými).

2) jedničková soustava je imho nesmysl, neboť algoritmus není schopen poznat konec vstupu. Pokud by detekoval konec vstupu podle konce vstupu, je "konec vstupu" v podstatě druhý symbol a jde tedy o soustavu dvojkovou.

938
Vývoj / Re: Optimální algoritmus výpočtu
« kdy: 19. 10. 2010, 11:39:10 »
Citace
Habala v tom článku taky říká, že silná indukce existuje, a ty mu to popíráš.
Popírám to ve smyslu, že silnou indukcí lze dokázat jinou množinu tvrzení než slabou. Silná a slabá indukce jsou jen dva pohledy na axiomy indukce z teorie množin, jestli to chceš přesně:
http://logika.wz.cz/files/baktm.pdf

Citace
Pokud je f(n) definována korektně, P(n) = f(n) plyne okamžitě z Lemmatu, na to indukci nepotřebuješ.
f(n) není definována korektně nebo nekorektně. f(n) je definována algoritmem.

f(0) = 0
f(n) = min( i(n), f(a) + f(b): a+b = n), a,b,n je z N, i(n) = nejnižší cena balení s i prvky,

kdyby byla f(n) definována jako
f(n) = min( i(n), P(a) + P(b): a+b = n), a,b,n je z N, i(n) = nejnižší cena balení s i prvky,
tak indukci nepotřebuješ. Jenže tato ta funkce definovaná prostě není. Takže potřebuješ vědět, že jsi v kroku n  vyřešil předchozí kroky.

V podstatě se dá vulgárně říci: pokud v n-tém kroku algoritmu používáš výsledky z předchozích kroků, dokazuje se algoritmus indukcí.

Citace
Možná, že tě plete, že většinou indukce pevný bod vyžaduje, a ty se do pozice pevného bodu snažíš vmanévrovat nulu. V našem případě ale pevný bod není u indukce vůbec potřeba:
Prosím, přestaň psát nějaké dojmy a používej matematicku. Jak je definovaná věta o MI? Platí-li P(n_0) a P(n_0) ... P(n) => P(n+1), pak....
Tak jaktože není pevný bod potřeba? K tomu, abys použil větu, musíš splnit všechny předpoklady.

Ano, můžeš si jestli chceš zopakovat důkaz věty o MI aplikovanej na tento konkrétní příklad, tím si dokázat slowthinkerovu větu o matematické indukci problému batohu a tu pak aplikovat bez potřeby pevného bodu. Pravda, bude diskutabilní, jestli vůbec jde o indukci (ta v sobě inherentně nese potřebu pevného bodu, viz schéma axiomu o induxi) a bude to asi desetkrát složitější a daleko méně čitelné, ale jde to. Jestli si chtěl slyšet todle... :-)
Já preferuju, že si udělám byť nepotřebný pevný bod, který mám dokázán hned a použiju již existující větu. To je taková úchylka matematiků, že když vyřešej jeden příklad, tak ostatní na něj převáděj.

Znáš ten vtip s tim, hoří barák, máš hadici a hydrant a sirky, co uděláš?
No a teď seš ve stejné situaci a barák nehoří.... Co uděláš teď?
Do praktickýho života seš asi použitelnější, ale na matiku se Tvuj přístup fakt nehodí...




939
Vývoj / Re: Jaký jazyk zvolit pro začátečníka
« kdy: 18. 10. 2010, 17:46:44 »
Ok, píšu samé nesmysly a nic nechápu. Ovladač je rozhraní k televizi, počítač je rozhraní k internetu (takže internet implementuje počítač) a já jsem rozhraní k počítači. :-) :-) Jdu se implementovat... :-)

940
Vývoj / Re: Jaký programovací jazyk pro mainframe
« kdy: 18. 10. 2010, 12:46:33 »
Programování je stejné na mainfraimu jako na smartphonu. Co se liší jsou jedině knihovny a ty se stejně musíš naučit až na konkrétním mainfraimu. Takže se prostě nauč programovat.

941
Vývoj / Re: Jaký jazyk zvolit pro začátečníka
« kdy: 18. 10. 2010, 12:40:30 »
bubavanek:
nic si z toho nedělej, na todle bychom si měli založit svuj thread. Nicméně pokud si dáš práci a pochopíš, o čem se píše, myslím, že Ti to k něčemu bude, ať už skončíš u C++ nebo ne.

novacisko:
Citace
V Javě taky. Co když tu metodu nějaký předek reimplementuje?....
 A mohu kontrovat i tím, že ... vždycky tam můžete vrznout tu virtuální dědičnost...
a) No tak napíšu tu reimplementaci. Přeci když přidávám novou metodu, tak vím, co má metoda dělat a kterých tříd se týká. Nemusím ale hrabat do tříd, které tuto metodu dědí a to považuji za podstatné.
Právě to, že při modifikaci třídy musím modifikovat i potomky nepovažuji za vhodnou vlastnost.

b) Např. u agilní metodiky se budu v předcích hrabat furt. Takhle skončím se všemi dědičnostmi virtuálními...

Citace
Naučte se C++. Při downcastu nemusíte přetypovávat static_castem (můžete).
Co kdybyste místo předpokládání, že je ten druhej blbej se snažil pochopit, coten druhý píše?
Kód: [Vybrat]
class IA
{
public:
virtual void a()=0;
};

class IB: public IA
{
public:
virtual void b()=0;
};

class A: public IA
{
public:
void a() {};
};

class B: public A, public IB
{
public:
void b() {};
void a() {};
a.cpp: unmodified: line 1
class IA
{
public:
virtual void a()=0;
};

class IB: public IA
{
public:
virtual void b()=0;
};

class A: public IA
{
public:
void a() {};
};

class B: public A, public IB
{
public:
void b() {};
void a() {};
B() {};
};


int main()
{
        B* b=new B();
        IA* a=b;
}
Tady (na předposlední řádce) přetypovávat musím, jinak kompilace spadne. Právě proto, že pro C++ je IA a IB jiné rozhraní, přičemž ve všech ostatních jazycích se IB bere jako rozšíření IA .
A jestli jste myslel, že můžu použít normální přetypování, tak to sice máte pravdu, ale obecně se C-like přetypování užívat v C++ programech nedoporučuje, anžto může zavléct chybu....

Citace
Dálkový ovladač byl použit jako abstrakce rozhraní.
Ale copak je ovladač rozhraní - tedy ve vašem významu (se kterým úplně nesouhlasím) tedy komunikačním protokolem?? Ovladač je entita, která vysílá povely nějakým komunikačním kanálem jiné entitě (televizi).

Citace
Nebo si myslíte, že tím, že implementuje třída rozhraní říká, že třída je rozhraním? Toje taky blbina.
IMHO není. Pokud např, objekt implementuje rozhraní ISerializible, pak ten objekt JE serializovatelný. Možná spíše bych volil "se navenek chová jako objekt typu popř. objekt mající danou vlastnost".
Pokud omezím "implementovat rozhraní" na "rozumí komunikačnímu protokolu", vede to imho právě na chyby v návrhu, protože to neodhalí složené objekty. Televize s videem rozumí jak příkazům pro televizi, tak příkazům pro video - takže při vašem přístupu je košér implementovat obě rozhraní. Jak jsem ukázal v minulém postu, pokud to ale implementuju jako objekt, tak se brzy při případných úpravách dostanu do problémů - televizi se dvěma videi tímto způsobem neimplementuji.
Pokud přijmu můj přístup, tak televize není video, video není televize a televize s videem není ani video, ani televize, ale spojení dvou objektů. Takže nechám televizi implementovat rozhraní televize, videu rozhraní videa a není žádný problém.

Proto tvrdím: implementovat rozhraní znamená konstatování, že tento objekt je nějaké povahy (např. být televizí, být serializovatelný atd...). 

Citace
a)A co stavové protokoly? (rozšíření dalším rozhraní přidá další stavovost, kterou původní rozhraní neumí)
Představte si rozhraní jako port na serveru: Jak to rozhraní pozná, že ta druhá strana, která s tím protokolem komunikuje je stavová či nestavová? Jediná možnost je, že se zašle nějaký příkaz: přepni se do rozšířeného módu. Ale pak to jde implementovat v jedné metodě a nepotřebuji různé metody podle toho kdo volá. Takto se dá koukat např. na IP protokol, kde vždy musí být uvedeno, jestli jde o TCP nebo UDP....

Anebo stavová komunikace používá jiný kanál než nestavová komunikace (např. TCP/UDP). Pak ale přeci nejde o stejné rozhraní.... TCP přeci není totéž co UDP - i když používá "stejná" čísla portů...

Citace
b)To že má druhý ovladač stejně barevná tlačítka a tři tlačítka navíc neznamená, že ty barevná tlačítka dělají totéž jako na prvním ovladači
Ale ovladač přeci není rozhraní!!! Ovladač je reálný objekt, nikoli komunikační protokol. Ty dva ovladače budou sdílet stejné vstupní rozhraní "mít tři stejná barevná tlačítka". A pokud dělá každý jinou věc, tak stisk těch tlačítek vyprovokuje komunikaci po jiném rozhraní s ovládaným objektem (nebo lépe po stejném rozhraní - obé bude infra - ale s jiným objektem a jinými kódy).

Vždyť i pokud by byl ovladač rozhraní, tak jak byste implementoval programovatellný ovladač, který umí ovládat padesát různých věcí? To kvůli jednomu objektu budete modifikovat padesát tříd a každé přidávat další rozhraní? I  když jak ta televize, tak video i HIFI věž se existencí programovatelné ovladače vůbec nezmění?  Furt půjde jen např. vypnout posláním 000, zapnout posláním 001 a přepnout program posláním 100??

Naopak pokud přijmete paradigma, že ovladač je objekt, tak prostě napíšete jeden programovatelný ovladač, který bude umět volat jedno obecné rozhraní IInfraOvladač.
Dokonce se pak může klidně stát, že jeden příkaz zapne televizy, na videu spustí nahrávání a na HIFIvěži vymění CD. A to celé zajistím, aniž bych jakýkoli přístroj modifikoval.

PS: samozřejmě, pokud programuju jednoduchou věc, často ovladač a televizi pro jednoduchost sloučím. Je to ale "berlička", měl bych si být vědiom, že to co dělám je nelegální a v případě implementace např. dvou ovladačů budu muset buďto prasit
(s omluvou: váš přístup :-)), nebo refaktorovat.
Ono v tomto případě je zas ale lepší se vykašlat na ovladač a tvářit se, jako že se ovládá přímo televize. Pokud budu potřebovat více různých ovladačů, tak vždycky mohu dopsat "mezivrstvu".

Citace
RAII pattern je v C++ velice oblíbený. V zásadě bych se bez něho nikam nehnul....
To co v javě schází je automatická destrukce (a uzavření). Souhlasím, že to někdy vadí, na druhé straně mám dva typy zdrojů: jedny je potřeba uvolňovat hned, druhé nikoli.
U prvního typu zdrojů je imho chyba spoléhat na RIAA a chytré pointery, když se mají uvolňovat co nejdříve, tak bych je měl opravdu uvolnit hned a explicitně - spoléhat na to, že tento pointer nikam neuteče není moc bezpečné - při další úpravě se situace změní a zdroj se neuzavře.
(Navíc většina chytrých pointerů používá reference counting a tedy reálně hrozí, že dojde k zacyklení a neuvolnění zdroje - ale třeba máte chytřejší implementaci chytrých pointerů?).

U druhého typu jde naopak počkat "až někdy". V tu chvíli mohu použít kombinaci pseudodestruktorů a nějakého sběrného objektu, který na konci programu zajistí uzavření všech dosud neuzavřených zdrojů. Samozřejmě to si musím napsat, ale implementace nebude složitější než chytré pointery v C++.

Takže imho RAII pattern je v javě v podstatě stejně použitelný jako v C++, jen se musí využít toho, co nabízí java a ne k tomu přistupovat jako k C++. Výsledek bude +- stejný: V C++ občas díky zacyklení nedojde k uvolnění zdroje, v javě zas dojde k uvolnění zdroje se zpožděním oproti C++.






942
Vývoj / Re: Přenositelnost programu v C++
« kdy: 18. 10. 2010, 00:00:43 »
Code blocker neznám, takže poradím jen "abstraktně". Jsou dvě možnosti. Buď musíš zajistit, aby program používal ve windows i v linuxu stejný knihovny. Tzn. projít projektovej soubor a vyházet vše, co nepotřebuješ. Koukám tiger radí jak.

Pokud i po vyházení zjistíš, že potřebuješ na winech např. mingw knihovnu, která na linuxu není či naopak, tak buďto musíš použít dvě verze projektovejch souborů, nebo podmíněnej překlad.

Jak udělat odmíněnej překlad je vícero způsobů. Pokud to IDE používá makefile, tak man make. Jinak zjistit v dokumentaci k IDE, jestli není nějaká možnost podmíněnýho překladu, poslední možnost jsou direktivy #pragma + C preprocesor. Je však možné, že tvoje kombinace IDE a kompilátoru nepodporuje ani jednu možnost.

943
Vývoj / Re: Jaký jazyk zvolit pro začátečníka
« kdy: 17. 10. 2010, 23:47:04 »
Citace
Ono samotné používání callback funkcí není čisté řešení....
Anonymní funkce se např. používají i u funkcionálních paradigmat a tam je to imho čisté. U callbacků je interface asi o něco čistší, s tím souhlasím, ale pořád definice
objektu + jeho užití je IMHO méně user friendly než anonymní objekt (proč by se jinak anonymní objekty zaváděly)?

Citace
Pokud změníte implementaci v předkovi, v potomkovi se to samozřejmě měnit nemusí.
Souhlas - ale já mluvím o změně interfacu, nikoli změně implementace.

Citace
...Pokud některý objekt změní svůj interface, zpravidla musíte upravit všechny místa programu, kde se interface používá....
To ano, v C++ ale navíc musím upravit ještě všechny potomky, ve kterých jsou wrappery pro tyto funkce.  Např. přidám do interfacu jednu metodu. V javě stačí přidat implementovat metodu v předkovi. V C++ navíc musím projít všechny potomky tohoto objektu které dědí zděděný interface a doplnit patřičný wrapper.

Navíc ty potomci nemusí být ani v mém kódu (např. různé pluginy třetích stran distribuované jako zdrojový kód).  V tu chvíli z jednoduché operace (přidání pár řádek a rekompilace pluginů) se stane dosti složitá věc: musím kontaktovat všechny vývojáře pluginů a požádat je o patřičné úpravy v kódu a záslání nové verze pluginů (totéž v menší míře samozřejmě nastane i při týmovém vývoji).

---
Další nepřijemnost je, že pokud mám takový objekt
(interface IA, interface IB extends IA, class A implements IA, class B extends A implements IB) tak kdykoli chci použít B jako objekt typu IA, tak musím přetypovávat - což navíc v C++ vzhledem k složitosti konstrukce static_cast není příliš přehledné.

Citace
A to je problém? Objekt se kolikrát skládá z mnoha objektů. Klasický příklad je televize. Má jedno rozhraní, dálkový ovladač a přesto je to vlastně skládačka mnoha objektů
Ano, televize je skládačka mnoha objekt;. Jeden z nich je i dálkový ovladač, který volá funkce televize. Ale televize NENÍ dálkový ovladač. Např. proto, že dálkový ovladač může ovládat více televizí, nebo naopak televize byla ovládaná více dálkovými ovladači.
Implementovat ovladač jako součást televize je IMHO hrubá chyba.

Citace
A kupodivu může mít dvě rozhraní, z nichž jedno obsahuje část druhého a přesto to dělá něco jiného. Rozhraní je popis protokolu komunikace. Rozhraní A rozšířené o rozhraní B pak může přistupovat k jiným službám, než samotné rozhraní B, které nic nerozšiřuje.
Ehm? Takže jeden dálkový ovladač pošle televizi signál 0001 a televize se vypne, zatímco když to ve stejné situaci pošle druhý ovladač naprosto stejný signál, tak se zvýší jas televize? Jenom proto, že druhý ovladač umí vyslat ještě i 0010? To je přeci blbina.

Pokud B přistupuje k jiným službám, tak jsou to opravdu jiné služby, tzn. by měli být reprezentované jiným rozhraním. A pokud opravdu používají stejný protokol, pak musí být nutně jiný přijemce, tzn. příjmající objekt se skládá z více částí, kdy každá část implementuje nějaký interface - správné je tedy užít kompozici více objektů.

Tomu co popisujete by např. odpovídala televize s integrovaným videem, kdy jak televize tak video má svůj ovladač. Monolitická implementace vypadá Ok.... do té doby než např. přijde televize s integrovaným DVD. Nebo se integrované video rozbije.... Nebo když někdo integruje do televize videa dvě (by se dalo kopírovat z jednoho na druhý).
S kompozitním přístupem tyto modifikace provedu snadno, u monolitického designu bude např. integrace druhého videa dosti složitá - jak rozliším ty dva ovladače na video, když oba mají naprosto stejné rozhraní?

IMHO zaměňujete rozhraní s ovládáním. To že se něco něčím ovládá ještě neznamená, že to implementuje dané rozhraní. Implementovat rozhraní imho znamená spíše býti něčím, popř. umožňovat něco.
Televize tedy má rozhraní přijmi povel.  Ten povel může vysílat např. tlačítko na televizi, příjkmák infra a tak... A to infra vyšle objekt ovladač, implementují metodu zmáčkni tlačítko(typ tlačítka). Mixovat to dohromady je imho chyba.

Citace
V C++ udělám vše jako v Javě a ještě něco navíc. Všechno bych ale překous, klidne oželil omezené C++ jako Java, ale chybějící destruktory v Javě prostě je něco, co se nedá překousnou.
V javě jdou destruktory emulovat pomocí klasických metod - jediný rozdíl oproti klasickým destruktorům pak bude v tom, že u lokálních proměnných se nebude destruktor volat automaticky. U dynamicky alokovaných je pak imho zcela jedno,
jestli volám delete object, nebo object.delete().

Nicméně souhlasím, že na některé úkoly (např. čtení ze souboru) je koncept lokálního objektu s automaticky volaným destruktorem na používání přijemný a lze daný kód napsat úsporněji než v javě.
Osobně to však nevidím jako takový problém, stejně je v drtivé většině možné - a tedy i vhodné - uvolnit daný zdroj (ať jde o soubor, připojení k databázi apod.) dřív než při zániku objektu.
Případné řešení chyb lze pak řešit pomocí try.... finally a zajištění toho, že došlo ke korektnímu uzavření objektu lze provést kontrolou v pseudodestruktoru. Nicméně ukecanější než jednoduchý lokální objekt to je, v tom souhlasím.


944
Vývoj / Re: opet jaky jazyk...
« kdy: 17. 10. 2010, 18:15:04 »
Popř. Java. Z C se přechází snadno a jazyk je to taky dobrej.

945
Vývoj / Re: Jaký jazyk zvolit pro začátečníka
« kdy: 17. 10. 2010, 15:44:49 »
mirec:VB nic moc, souhlasím. Ale takovej pascal na jednoduché algoritmy je imho vhodnější jazyk - už jen porovnej hello world. OOP má smysl až u větších projektů. Jenže člověk, kterej sotva zvládne napsat setřídění pole může psát větší projekt?
Navíc v javě je v hello worldu spousta balastu, která se poměrně špatně začátečníkovi vysvětluje. A když se nevysvětlí, tak se učí největšímu programátorskýmu nešvaru - používat něco, aniž by vlastně věděl co a proč.

Ultimator:Na C++ je to zvláštního, že je velmi blízko hardware. Takže se na něm velmi dobře učí jak dělat věci efektivně. Není výjimkou, že vidím v kódu např
$a=explode(',',$vstup);
$a=$a[1];
Takovoudle prasečinu člověk, co umí C++ nenapíše, protože tomu je jasné, o kolik je to více práce než
if($false===($pos=strpos(',',$vstup)))
   $a=$vstup;
else
   $a=substr($vstup,0,$pos-1);

hurda: ano, protože pokud se někdo naučí C/C+, tak se naučí
a) psát pořádně a neprasit
b) psát efektivní kód
pokud se to totiž nenaučí, tak C/C++ neumí!

 David Strejc:jde o to jak která. Samozřejmě naprogramovat střeva velký apliakce typu twitter tak, aby to opravdu vydrželo zátěž je hezkej kus práce. Na druhou stranu na to člověku jen znalost php nestačí - je třeba pořádně rozumět databázím, race condition, optimalizacím...,.... Ale právě znalost tědle věcí se nejlépe získá tím, že se člověk nebude omezovat na PHP a nastudování jedné knihovny.

Na zbytek hezky odpověděl Semestralky.

novacisko:
Nová verze C++ bude velkým krokem kupředu. Ale zatím tady není a i když nějaké kompilátory některé věci používají, není to C++ dle normy. Já se bavím o C++ dle poslední platného standardu.

Citace
Ale jo, jde, protože můžete deklarovat třídu uvnitř funkce a v ní můžete deklarovat funkci. Jediný problém je, že tuhle funkci nelze nacpat jako parametr šablony, ale jinak se s ní dá pracovat jako s funkcí.
Což je vyloženě čisté, čitelné a pohodlné řešení...

Citace
Tak mu je tam vyrobte. Co řešíte....
Proto tvrdím, že C++ se na objektové psaní hodí o něco méně. Protože musím ručně vyrábět to, co jinde je automaticky. Navíc při každé změně předka musím měnit i potomka - což je opět proti OOP paradigmatu.

Citace
ale houby, diamantovou dědičnost nemusíte přece u interaců řešit
Musím v příkladu, který jsem dal. Respektive jinak oproti jiným jazykům buď musím psát zbytečný balast a navíc je kód hůře udržovatelný (změna na jednom místě vynucuje změnu na x dalších), nebo musím užívat v hierarchii interfaců virtuální dědičnosti a utrpí tím výkon.

Citace
Interface poděděný přes A může mít jiný význam, než interface přímo, přestože je to stejný interface.... Já třeba občas používám i to, že jde o dva různé interface a v různých situacích se ten objekt chová jako dva různé objekty, podle toho, zkrs co se na něj dívám.
Podědění interfaců znamená rozšíření funkčnosti. Tzn. pokud objekt je např. seřaditelný a přidám interface seřaďitelný dle kritéria, nemělo by to na seřaditelnosti nic měnit. Jinak je to porušením zásad OOP.
Pokud se objekt chová jinak při volání přes básový interface než přes poděděný interface, tak jde imho s největší pravděpodobností o chybu návrhu: buďto jde opravdu  o dva "reálné" objekty implementované jedním programátorským objektem (správné řešení by bylo tedy rozdělit ho na dva a implementovat správné interfacy), nebo naopak poděděný interface nemá být potomkem bázového interfacu (protože ho nespecializuje, ale dělá trochu něco jiného).
Ono to i naznačuje to co píšete - pokud se něco chová jako dva objekty, tak to s největší pravděpodobností dva objekty jsou :-)

Pokud nesouhlasíte s tím, že takový design je chyba v návrhu, dejte sem nějaký reálný příklad, kdy se to takto chová a je to dle vás správně. Nebo možná radši do samostatného threadu, jsme dosti OT.


Citace
Prostě důvodem je zjednodušení implementace.
Samozřejmě. Stejně jako u C++ je zjednodušení implementace to, že člověk musí rozlišovat mezi normální a virtuální dědičností. Pokud vícenásobnou dědičnost omezím na interfacy, tak se každá dědičnost chová jako virtuální. Pokud se neomezím, tak musím řešit virtualitu dědičnosti a navíc u hlubších virtuálně poděděných struktur narůstá overhead z virtuální dědičnosti.
Jsou to dva přístupy a vzhledem k tomu, že u všech nových jazyků zvolili cestu interfaců, troufám si tvrdit, že to je proto, že se s pomocí interfaců píše lépe než s pomocí vícenásobné dědičnosti. Byť mi někdy schází. Samozřejmě, nejradši bych jazyk co umí obé, ale kdybych si měl vybrat tak souhlasím s dnešním trendem a říkám: interfacy.
Je možné, že na některý konkrétní projekt by byla vícenásobná dědičnost vhodnější  - jen myslím, že projektů, kde se spíš užije snadná definice interfaců je více.

C++ je úžasně flexibilní jazyk a dají se v něm dělat kouzla a chápu, že ho máte rád. Kdybych pracoval na projektech, kde se dají tydle vlastnosti využít, tak bych si to také užíval (např. šablonový systém C++ asi nemá obdoby).
Ale to nic nemění na tom, že díky absenci některých věcí (byť je můžu díky flexibilitě jazyka více či méně emulovat) se v něm nepíše objektově tak jednoduše a hezky jako např. v Javě. Ale dovede zas jiný věci, o tom žádná... :-)

Stran: 1 ... 61 62 [63] 64 65 ... 68