Lynx Posted February 11, 2008 Report Share Posted February 11, 2008 Vēlējos noskaidrot cilvēku domas par objektu izmantošanu javascriptā. Pamazām attīstot projektu ir sarakstītas kopā ļoti daudz funkcijas, un bieži daļa funkciju būtu klasificējamas kā atsevišķa vienība lapas funkcionalitātes nodrošināšanai, piemēram, dragošana vai tooltipi. Bieži šīs te funkcijas ik pa laikam izmanto globālos mainīgos, lai padotu datus, piemēram, tā pati dragošana: var _dragElement; glabā pašreiz kustināmo objektu, lai piemēram, function doDrag(e){ if (e == null) var e = window.event; _dragElement.style.left = (_offsetX + e.clientX - _startX) + 'px'; _dragElement.style.top = (_offsetY + e.clientY - _startY) + 'px'; } Nebūtu katreiz jameklē, kurš objekts tiek kustināts. Un tātad jautājums: vai ir loģiski šīs funkcijas un globālos mainīgos sabāzt atsevišķās klasēs, piemēram: var Drag = { }, lai nepiesarņotu vidi ar globālajiem mainīgajiem un kā tas attieksies uz koda performance?(Ar FF3 gan izskatās, ka tā vairs nekur nebūs problēma, bet tāpat interesē :)) Link to comment Share on other sites More sharing options...
Vebers Posted February 11, 2008 Report Share Posted February 11, 2008 Iesaku to darit. Kods tiraks un uzreiz saprotamaks. Kadreiz kad iemacijos JS OOP tas ta iepatikas, ka tagad to tik vien daru kaa rakstu OOP JS :) Link to comment Share on other sites More sharing options...
Delfins Posted February 11, 2008 Report Share Posted February 11, 2008 matemātiskās f-jas gan labāk globāļos ielikt. OOP ir jāizmnto tikai tad, kad tiešām vairāk darba ir ar pašu objektu, nekā tikai 1-reiz pasaukt f-ju... stulbi. Link to comment Share on other sites More sharing options...
mefisto Posted February 11, 2008 Report Share Posted February 11, 2008 (edited) Blah blah blah JavaScript nav objektorientēta valoda. Tā ir prototip-orientēta. Pamatus vari apgūt šeit : http://mckoss.com/jscript/object.htm Bet es ieteiktu lasīt base2 vai mootools Tad vēl ir šādas lekcijas: http://video.yahoo.com/video/play?vid=111593 http://video.google.com/videoplay?docid=-474821803269194441 edit: speciāli priekš Delfins, vakara lasāmviela : http://dean.edwards.name/weblog/2007/03/rules/ Edited February 11, 2008 by mefisto Link to comment Share on other sites More sharing options...
Lynx Posted February 11, 2008 Author Report Share Posted February 11, 2008 Eh, mefisto, es nejautāju par pamatiem, bet vairāk par ideoloģiju aiz objekt orientēta js izmantošanas. Jo lielākā daļa rakstu par šo tēmu paņem oop kā status quo. Un nekur neapspriež galvenos mīnusus vai arī kad tieši loģiski būtu viņu izmantot. Situācija ir tāda, ka pašlaik mans kods darbojas precīzi kā vajag un pilda savu funkciju, bet es vienmēr meklēju veido kā to uzlabot(gan lai pašam ērtāk, gan ātrāk darbojas) un šis šķita nākamais loģiskais solis un tieši tāpēc vēlējos dzirdēt citu viedokli. Un daži to arī izteica, paldies. Link to comment Share on other sites More sharing options...
bubu Posted February 11, 2008 Report Share Posted February 11, 2008 Satura topikā es savulaik ieliku dažus labus linkus uz lasāmo par JS "OOP-ismu": http://www.cs.rit.edu/~atk/JavaScript/manuals/jsobj/ http://www.crockford.com/javascript/ http://www.jibbering.com/faq/faq_notes/closures.html http://www.onlinetools.org/articles/unobtrusivejavascript/ Manas domas - neimspeisi ir laba lieta. Man personīgi paša kodu patīk organizēt neimspeisos, tādējādi ir lielāka kārtība nevis liels kišmiš ar funkcijām globālajā neimspeisā. Link to comment Share on other sites More sharing options...
marrtins Posted February 12, 2008 Report Share Posted February 12, 2008 Blā blā blā... JavaScript nav prototiporientēta. Tā ir procedurāla. Ahā! Tā nav procedurāla - tā ir funkcionāla programmēšanas valoda. Bet var būt gan funkcionāla prototip-objekt-orientēa? Blah blah blah JavaScript nav objektorientēta valoda. Tā ir prototip-orientēta. Nevajag tā muļķoties, ok? Link to comment Share on other sites More sharing options...
andrisp Posted February 12, 2008 Report Share Posted February 12, 2008 Vai ir svarīgi strīdēties par terminaloģiju ? :) Domāju, ka vienīgais, ko autors grib, ir neimspeisot mainīgos. Un izmantojot, JSON objektu pierakstu veidu vai jebkuru citu objektu būvēšanas veidu (par tiem citiem gan neesmu parāk informēts, bet JSON aktīvi lietoju), to lieliski var panākt. Link to comment Share on other sites More sharing options...
bubu Posted February 12, 2008 Report Share Posted February 12, 2008 lol, funkcionāla? Tu vispār zini, kas ir funkcionāla valoda, marrtins? JS ir patālu no funkcionālas valodas. Tajā var mēģināt programmēt funcionāli, taču tas ir liels čakars, jo tā sākotnēji tam nav bijusi paredzēta. Scheme, ml, haskell - lūk tās ir funkcionālas valodas. Kā jau tev saka - JS ir prototiporientēta, nevis OOP: http://en.wikipedia.org/wiki/Javascript#Prototype-based. Prototip-orientētā valodā nav atšķirības starp klasi un instanci. Jauni objekti tiek veidoti mainot esošu objektu prototipus ("klases"). Savā veidā, vienkāršoti sakot, jebkurā dinamiskā valodā, kurā klasei runtaimā var mainīt (pielikt/noņemt) nost metodes/atribūtus varētu saukt par prototip-orientētu. Piemēram, Python. Link to comment Share on other sites More sharing options...
marrtins Posted February 12, 2008 Report Share Posted February 12, 2008 Es ļoti labi zinu, kas ir funkcionāla. Tevis nosauktajiem priekšā liekam Lisp un tad pārējos. JS ir patālu no funkcionālas valodas? Protams, ka Javascript nav pure functional, tomēr ir vistuvāk no visām "populārajām" valodām. Liels čakars? Spilgts piemērs jQuery. Ļoti eleganti, nevis čakarīgi. Piemērs funkcionālai pieejai JavaScriptā. function f(param) { return function (param2){ return param * param2; } } var a = f(2); alert(a(3)); To pašu visnotaļ ērti var izdarīt Perl`ā, Ruby, Pitonā (jau čakarīgāk), taču pamēģini to, piemēram C vai Paskālā vai kādā citā zemāka līmeņa valodā - tad būs skaidrs, kas ir čakarīgi :) Prototip-orientēts vai objekorientēts faktiski ir tikai implementācijas jautājums nevis fundamentālas atšķirības, ko ir vērts nodalīt. Piemēram, Haskelī vai Erlangā arī var programmēt objektorientēti, tāpēc mēs tās valodas nesaucam objekt-orientētas. Link to comment Share on other sites More sharing options...
bubu Posted February 12, 2008 Report Share Posted February 12, 2008 Ar vārdu čakarīgi es domāju lieko sintaksi, kas tur dafiga jāraksta, lai panāktu kautko tik vienkāršu kā, piemēram, funkciju, kas atgriež citu funkciju. Pat pitonā to var pierakstīt daudz vienkāršāk: f = lambda x: lambda y: x*y. JS ir tikai funkcionālas valodas iespējas, nevis tā IR funkc. valoda. Tikpat labi, es varu teikt, ka arī C++ ir funkcionāla valoda: #include <boost/function.hpp> #include <boost/bind.hpp> template <class T> T Mul(T param, T param2) { return param * param2; } template <class T> boost::function<T (T)> f(T param) { return boost::bind(Mul<T>, _1, param); } boost::function<int (int)> a = f(2); std::cout << a(3); Bet es ļoti šaubos vai tu atradīsi kādu, kurš tev piekritīs par to, ka C++ ir funkcionāla valoda. Link to comment Share on other sites More sharing options...
marrtins Posted February 12, 2008 Report Share Posted February 12, 2008 Šajā gadījumā JS lieki ir tikai statementi (return {} par iekavām var padiskutēt), bet C++ variants tiktiešām IR --pī-- :) Šajā sakarā man patīk http://en.wikipedia.org/wiki/Greenspun's_Tenth_Rule Šāds piton pieraksta variants kurā versijā parādījās? Bet es ļoti šaubos vai tu atradīsi kādu, kurš tev piekritīs par to, ka C++ ir funkcionāla valoda. Taču atrodas kāds, kas apgalvo, ka JS valoda *NAV* objektorientēta ;) Link to comment Share on other sites More sharing options...
bubu Posted February 12, 2008 Report Share Posted February 12, 2008 Tev kaut kā nešķiet, ka tieši vairums apgalvo, ka JS NAV OOP un tikai mazākums (vai mazāk zinošie) apgalvo, ka JS ir OOP? Stulbs salīdzinājums (bet tomēr): "JavaScript prototype oriented" vs "JavaScript OOP" gūglē atgriež 499000 vs 276000 ierakstus. Es nenoliedzu, ka JS'ā var programmēt OOP'iski (izmantojot OOP ideoloģiju). Bet veids, kā tu implementēsi tos objektus, tas nebūs OOP veidā/sintaksē - tev nāksies izmantot prototype-oriented programmēšanu. Tieši tas pats kautvai ar to Pitonu - var mēģināt "funkcionāli programmēt", bet Pitons NAV funkcionāla programmēšanas valoda. Arī C valodā var OOP'iski programmēt, bet nu... neviens tak nesauks C par objektorientētu valodu. Šāds piton pieraksta variants kurā versijā parādījās? Hvz, bet 2.3 versijā toč ir. Link to comment Share on other sites More sharing options...
marrtins Posted February 12, 2008 Report Share Posted February 12, 2008 To, ka JS ir funkcionāla es liku pretī apgalvojumam, JS *NAV* objektorienēta. Ja valodā X vienlaicīgi (un bez *hackiem*, skat vēlreiz Greenspun's Rule) var programmēt objektorientēti un/vai funkcionāli un/vai procedurāli un/vai ...., tad to mierīgi var pieskaitīt vienai, otrai vai trešai (vai jebkādā kombinācijā) valodu klasei un abgalvot, ka tā NAV ir parasta kašķēšanās. Ja Tev patīk google, tad `JavaScript prototype oriented`187,000 `JavaScript object oriented` 473,000 bet šajā gadījumā tas nav būtiskākais, jo kašķēšanās, kurai valodu klasei pieskaitīt konkrētu valodu, notiek arī daudz vairāk pieredzējušu programmētāju starpā. Būtiski ir tas, ka programmēt, piemēram, objektorientēti C nav tik eleganti (skat savu iepr pdf), kā programmēt funkcionāli JavaScript (skat jQuery). Un ja nav eleganti, tad rodas "liekvārdība" un pie noteiktu rindiņu/moduļu/simbolu skaita, kods vairs nebūs lasāms/uzturams. Jo objektorientēts C nezamazinās koda daudzumu (nepalielinās abstrakcijas līmeni), turpretī funkcionāla pieeja JS - samazina koda apjomu (palielina abstrakcijas līmeni), tātad to brīvi var pieskaitīt funkcionālo valodu klasei. Bet veids, kā tu implementēsi tos objektus, tas nebūs OOP veidā/sintaksē - tev nāksies izmantot prototype-oriented programmēšanu.objektorientētu valodu. Protams - to jau es arī teicu - atsķiras tikai objektorientētās pieejas implementācija. Sintakse nav ierastā Java/C++, bet ir cita - taču pamatideja paliek - veidot leilāku abstrakciju par, piemēram to pašu C. Plus vēl fīčas, ko dod prototype konstrukcija kā tāda. Link to comment Share on other sites More sharing options...
Recommended Posts