CoolBasic V3: Esittely

CoolBasiciin yleisesti liittyvä keskustelu.
Locked
User avatar
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Koodiapina » Sat Jun 13, 2009 1:56 pm

Eiköhän perinnällä onnistu järkevimmin.
Olen liian älykäs ollakseni väärässä. Jos olet kanssani eri mieltä, suosittelen sinua pohtimaan omaa elämänkatsomustasi ja sen perusteita.

User avatar
Zero
Lead Developer
Lead Developer
Posts: 725
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Zero » Sat Jun 13, 2009 8:00 pm

Ruuttu wrote:En tiedä miten tämä toimisi teknisesti jne jne, mutta onhan V3:ssa mahdollista antaa esim. objektille "rajaton" määrä muuttujia? Nykyisessä CoolBasicissa tulee välillä tilanne jossa yksi vihollinen tarttis 20 muuttujaa n ja toinen vihollinen vain 5. Sitten pistät 20 fieldiä, ja puolella vihollisista jää 3/4 niistä käyttämättä.
Perintä on oikea tapa lähteä ratkaisemaan tällaista ongelmaa. CoolBasic V3:ssa voidaan omia tietotyyppejä luoda struktuureilla ja luokilla; Struktuurit elävät pinossa (stack), joten niillä on määrätty elinaika. Luokat taas elävät kasassa (heap), joten niiden elämä loppuu vasta kun olio tuhotaan (tämä on manuaalista V3:ssa, automaattista roskienkerääjää ei toistaiseksi ole toteutettu). Tilanteesta riippuen joskus on fiksua luoda struktuuri luokan sijaan. Mutta struktuurit eivät voi periä toisiaan (ainakaan "is a"-merkityksessä). Sen sijaan sekä luokkia että struktuureita voidaan yhdistää "has a"-tavan mukaisesti. Käytännössä tämä tarkoittaa sitä, että struktuurissa tai luokassa määritellään jäsenmuuttuja, joka on sitä tietotyyppiä, jonka toiminnallisuuteen halutaan laajentaa.

Toteutus struktuurilla tai luokalla

Code: Select all

Structure PerusVihollinen
    Public HP As Integer
EndStructure

Structure AutoVihollinen
    Public perus As PerusVihollinen
    Public bensiini As Integer
EndStructure

Structure IhmisVihollinen
    Public perus As PerusVihollinen
    Public adrenaliini As Integer
EndStructure

Module Peli
    // Peli alkaa aina Main-funktiosta
    Function Main()
        Dim auto As AutoVihollinen
        Dim sotilas As IhmisVihollinen

        auto.perus.HP = 100
        auto.bensiini = 50

        sotilas.perus.HP = 90
        sotilas.adrenaliini = 0
        //sotilas.bensiini = 0 // Tämä ei tietenkään toimi, annetaan käännösvirhe
    EndFunction
EndModule
Ongelma tässä on se, että et voi tunkea ihmistä ja autoa samaan muuttujaan - edes silloin kun kyseinen muuttuja on tyypiltään PerusVihollinen. Niinpä järkevämpää on toteuttaa tämä luokilla:

Toteutus luokalla ja perinnällä

Code: Select all

// Kirjoitan ei-julkiset jäsenmuuttujat alaviivalla. Tämä ei tietenkään ole pakollista, se on vain henk. koht. tapa

Class PerusVihollinen
    Protected _HP As Integer // Tämä voisi olla myös Public, mutta hyviin tapoihin kuuluu ennemmin luoda Property joka muuttaa tämän arvoa. Itse asiassa tämän pitäisi olla Private ja sitten tähän pitäisi olla joko Public tai Protected Property, mutta menköön näin esimerkin nimissä simppelisti
EndClass

Class AutoVihollinen
    Inherits PerusVihollinen
    Private _bensiini As Integer
EndClass

Class IhmisVihollinen
    Inherits PerusVihollinen
    Private _adrenaliini As Integer
EndClass

Module Peli
    // Peli alkaa aina Main-funktiosta
    Function Main()
        Dim auto As New AutoVihollinen
        Dim sotilas As New IhmisVihollinen

        // Huomaa, että "perus"-kenttää ei enää kirjoiteta väliin
        auto.HP = 100
        auto.bensiini = 50

        sotilas.HP = 90
        sotilas.adrenaliini = 0
        //sotilas.bensiini = 0 // Tämä ei tietenkään toimi, annetaan käännösvirhe

        // Tämä on luokkien hienous:
        Dim vihu As New PerusVihollinen

        vihu = auto
        vihu = sotilas
        //vihu.HP = 100 // Nyt pitäisi olla "HP"-niminen propety määriteltynä "PerusVihollinen"-luokkaan
    EndFunction
EndModule
Tarinan opetus on se, että oliomaailmassa sen sijaan että tehtäisiin iso luokka, jossa on muuttujia joita ei tarvita kaikissa siitä tehdyissä olioissa, voidaan luokat määritellä pienemmiksi osikseen ka sitten luoda niiden välille perintäsuhde. Muistinkulutus per tietue on näin usein paljon optimoidumpaa.
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog

User avatar
Latexi95
Guru
Posts: 1164
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: CoolBasic? kuollut? eheei ole...

Post by Latexi95 » Sat Jun 13, 2009 11:44 pm

Oi oi... Näyttää vaikealta. :roll:

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: CoolBasic? kuollut? eheei ole...

Post by JATothrim » Sun Jun 14, 2009 12:46 am

Oi oi... näytää ihanalta. :P Saako roskenkerääjän asetuksia sitten muutettua? Kytkettyä kokonaan pois? Esim. erittäin muisti intensiivisessä koodissa (varataan ja vapautetaan tavaraa tieheään), jolloin nopeus on kriitinen tekijä.
EDIT:

Tarkoitan siis joskus tulevaa roskienkerääjää joka hoitaa myös muistivuodot ja new:illä varatut oliot.

Last edited by JATothrim on Sun Jun 14, 2009 5:57 pm, edited 1 time in total.
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

User avatar
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: CoolBasic? kuollut? eheei ole...

Post by phons » Sun Jun 14, 2009 12:53 am

Huh huh, aika iso askel nykyisestä CB:stä tuohon... Ja Grandi ja kumppanit ketkä tekivät niitä "koodi esimerkkejä", ei luulisi teille olevan vaikea kun jo tässä vaiheessa teette räiskintäpeli pohjia. :mrgreen:
Image

User avatar
Zero
Lead Developer
Lead Developer
Posts: 725
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Zero » Sun Jun 14, 2009 10:09 am

JATothrim wrote:Oi oi... näytää ihanalta. :P Saako roskenkerääjän asetuksia sitten muutettua? Kytkettyä kokonaan pois? Esim. erittäin muisti intensiivisessä koodissa (varataan ja vapautetaan tavaraa tieheään), jolloin nopeus on kriitinen tekijä.
Ohjelmoija vapauttaa kaikki tekemänsä oliot manuaalisesti. Vähän niin kuin nykyisessäkin CB:ssä on New ja Delete.
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: CoolBasic? kuollut? eheei ole...

Post by MaGetzUb » Sun Jun 14, 2009 11:16 pm

No tuohan näyttää jo todella kätevän oloiselta, tässä viikon parin aikana olen näköjään viisastunut. :) Tajusin ainakin yli 50%.. =D
*oivalluksen tunne* 8-)
Eli siis jos ymmärsin oikein niin:
Voidaan tehdä ensin luokka:

Code: Select all

Class Vihu
Protected Energia As Float // <- Protected tarkoittaako se nyt sitä, ettei sitä voida enää poistaa jne?
EndClass

Class Seppo_Vihu
Inherits Vihu //<- Lapataan tässä kohtaa ylemmän luokalle määritellyt muuttujat(?) tälle luokalle.
Private Turhaantuneisuus As Integer 
EndClass 

Class Ismo_Vihu
Inherits Vihu //<- Lapataanpa taas sisään Vihuluokan muuttujat.
Private Tuhovoima As Float //<- Tässä kohtaa tehdään taas Ismolle omat muuttujansa
Private Vihaisuus As Integer //<- Samoin kuin tässä
EndClass
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by SPuntte » Sun Jun 14, 2009 11:57 pm

@Programmer of DSG:

Syntaksi on periaattetasolla ihan oikein, vaikkakin se käytännössä toteutetaan vähän eri tavalla.

En tiedä, mitä tarkoitit ilmauksella "ei voida enää poistaa" viitatessasi protected-avainsanalla määriteltyyn luokan jäsenmuuttujaan, joten en voi sanoa, oliko päättelysi oikein vai väärin. Oleellisin asia protected-määritellyssä luokkatiedossa on, että se näkyy (ja on vaikkapa metodien kautta käytettävissä) myös luokan perillisille, toisin kuin private-näkyvyydellä määritellyt.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: CoolBasic? kuollut? eheei ole...

Post by MaGetzUb » Mon Jun 15, 2009 3:35 am

SPuntte wrote:En tiedä, mitä tarkoitit ilmauksella "ei voida enää poistaa" viitatessasi
Siis käsitin että siitä Protect muuttujasta tulee vakio perillisille.. :? (Mutta tätä arvoa voi silti muuttaa..)
SPuntte wrote:Oleellisin asia protected-määritellyssä luokkatiedossa on, että se näkyy (ja on vaikkapa metodien kautta käytettävissä) myös luokan perillisille, toisin kuin private-näkyvyydellä määritellyt.
Exelent. Juuri tätä minä hain! :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
Zero
Lead Developer
Lead Developer
Posts: 725
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Zero » Mon Jun 15, 2009 7:11 am

Private
Käytettävissä vain oman luokan sisältä (eli ei "näy" ulos)

Protected
Käytettävissä oman luokan ja perittyjen luokkien sisältä

Public
Aina kaikille käytettävissä (eli "näkyy" joka paikkaan)
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: CoolBasic? kuollut? eheei ole...

Post by MaGetzUb » Mon Jun 15, 2009 7:39 pm

Siis Public tekee Luokan jäsenestä tavallaan "Globaalin"? :)
Last edited by MaGetzUb on Mon Jun 15, 2009 10:53 pm, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Koodiapina » Mon Jun 15, 2009 7:58 pm

programmer of DSG wrote:Siis Public tekee Luokan jäsenestä tavallaan Globaalin? :)
Hieman oudosti ilmaistu, joten laitanpa selkeyttävää koodia:

Code: Select all

class lol
{
    int a;
    public:
        int b;
};

int main (void)
{
    lol joku;
    joku.b = 5;  // toimii
    joku.a = 31; // ei toimi
}
Olen liian älykäs ollakseni väärässä. Jos olet kanssani eri mieltä, suosittelen sinua pohtimaan omaa elämänkatsomustasi ja sen perusteita.

User avatar
Ruuttu
Devoted Member
Posts: 687
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: CoolBasic? kuollut? eheei ole...

Post by Ruuttu » Mon Jun 15, 2009 8:10 pm

...Selkeyttävää..?

Niin, joo...


EDIT: Ahaa... Got it, I think.
Last edited by Ruuttu on Mon Jun 15, 2009 9:22 pm, edited 1 time in total.

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Dibalo » Mon Jun 15, 2009 8:47 pm

Siis: kun luot uuden olion, voit käyttää sen muuttujia ja funktioita koodissa pisteoperaattorin '.' avulla.

Code: Select all

Class A
    Public Dim muuttuja As Float
EndClass

// luodaan olio
Dim o As A = New A()
// käytetään muuttujaa
o.muuttuja = 25.365
Mikäli Public:n tilalla olisi esimerkiksi Private tai Protected, ei "muuttujaa" voitaisi käyttää koodissa tuolla tavalla (kääntäjä antaisi virheen).
The darkest spells can be found from
http://tunkkaus.blogspot.fi

Timo

Re: CoolBasic? kuollut? eheei ole...

Post by Timo » Tue Jun 16, 2009 11:35 pm

Nyt menee vähän ohi; mitä hyötyä semmoisesta privatesta sitten on, jos sitä ei voi käyttää?

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Dibalo » Wed Jun 17, 2009 12:05 am

Privatea voidaan käyttää luokan metodien (funktioiden) sisällä:

Code: Select all

Class Ukko
   Private Dim x As Integer
   Private Dim y As Integer
   Public Function AsetaSijainti(Dim _x, Dim _y) As Void
      Me.x = _x
      Me.y = _y
   EndFunction
EndClass

Dim seppo As Ukko = New Ukko()
seppo.AsetaSijainti( 40, 60 )   // ok
seppo.x = 40   // virhe!
seppo.y = 60   // virhe!
The darkest spells can be found from
http://tunkkaus.blogspot.fi

User avatar
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by SPuntte » Wed Jun 17, 2009 12:16 am

Timo wrote:Nyt menee vähän ohi; mitä hyötyä semmoisesta privatesta sitten on, jos sitä ei voi käyttää?
Itseasiassa niitä voi käyttää, mutta ainoastaan luokan sisältä, toisinsanoen luokan jäsenfunktioiden eli metodien kautta. Tämä mahdollistaa olion datan paremman suojaamisen, kun siihen ei suoraan pääse mistä tahansa käsiksi, joten mahdolliset koodausvirheet löytyvät ainakin osaksi jo käännösvaiheessa. Lisäksi luokan tietorakenteet voidaan piilottaa, jolloin käyttäjän ei tarvitse muuta kuin osata kutsua sopivia funktioita sopivin parametrein (edelleen siis olion metodeja), jotka hoitavat itse olion datan käsittelyn käyttäjän puolesta. Tätä kutsutaan kapseloinniksi, ja se on erityisen hyödyllistä esimerkiksi kirjastoja rakennettaessa.

P.S. Dibalo antoikin jo aiheesta havainnollisen esimerkin.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX

Phons as guest

Re: CoolBasic? kuollut? eheei ole...

Post by Phons as guest » Wed Jun 17, 2009 12:21 pm

Pistän nyt "oman näkökulmani" miksi kannattaa käyttää Privatea, kun koodailin C++:lla niin tuli mieleen että Private ottaa vastaan dataa(jos on funktiossa) ja Public taas syöttää sitä. Protected "muuttujista" en ole tiennyt mitään, mutta en saanut vieläkään selvyyttä: Voiko Protected olla luokan ulkopuolella käsitelty?

User avatar
Zero
Lead Developer
Lead Developer
Posts: 725
Joined: Sun Aug 26, 2007 2:30 pm
Location: Helsinki, Finland
Contact:

Re: CoolBasic? kuollut? eheei ole...

Post by Zero » Wed Jun 17, 2009 12:53 pm

Pieni esimerkki:

Code: Select all

Class MunLuokka
    Private omaaDataa As Integer
    Protected yhteistaDataa As Integer
    Public julkistaDataa As Integer
EndClass

Class Perillinen
    Inherits MunLuokka // Perii kaikki ei-privaatit isäntäluokka "MunLuokka":sta

    Public Function JokuFunktio()
        omaaDataa = 5 // Virhe, tämä on "MunLuokka":n yksityistä omaisuutta
        yhteistaDataa = 5 // Tämä on OK, Protected on jaettu myös kaikille jälkeläisille
        julkistaDataa = 5 // Tämäkin on OK, Public on käytettävissä kaikkialta
    EndFunction
EndClass

Class IhanMuuLuokka
    Public Function OmaFunktio()
        Dim olio As MunLuokka = New MunLuokka

        olio.omaaDataa = 5 // Virhe, tämä on "MunLuokka":n yksityistä omaisuutta
        olio.yhteistaDataa = 5 // Virhe, Protected on vain luokan itsensä ja sen jälkeläisten käytössä
        olio.julkistaDataa = 5 // Tämä on OK, Public on käytettävissä kaikkialta
    EndFunction
EndClass
CoolBasic henkilökuntaa
Johtava Suunnittelija
CoolBasic V3, CoolBasic Classic

http://www.coolbasic.com/blog

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: CoolBasic? kuollut? eheei ole...

Post by MaGetzUb » Wed Jun 17, 2009 1:02 pm

Eli Privatella määritetyillä muuttujilla voidaan vain käsitellä funktioiden sisällä, kun taas Publicilla määritettyjä muuttujia voidaan käyttää joka paikassa lähdekoodissa! Eikö näin? :)
Olen ehkä 1 asekeleen lähempänä CB v3 kätevyyttä. ;)
EDIT:

Vinkkinä vain, että te konkarimmat koodarit, teidän kannattaa kertoa asiat selkeästi sillä tavalla, että vertaatte niitä nykyisiin cbn ominaisuuksiin. ;) Esim mitä ei nykyisessä ole ja miten se käytännössä nykyisessä cbssä ilmenisi. Se voisi helpottaa monia. ;) Että älkää puhuko 'siansaksaa' vaan tavallaan vaikka niin, miten te käsitittä asiat silloin kun harjoittelitta sitä. Se olisi ainakin minulle hyödyllistä, uskon että muillekkin ihmisiähän me vain olemme. ;) :)

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

Locked