Koda snabbt som F*N! (The IntelliJ way…)
- mån 23 apr, 2007 kl 20:02
- 6 kommentarer
- IntelliJ IDEA, Java, Programmering, Verktyg
I min presentation för JavaOne beskriver jag hur du kan skriva ett 3D spel på mindre än 50 minuter. Detta har gjort att vissa höjt lite på ögonbrynen och ställt sig tveksama till att det faktiskt går att skriva det så snabbt. Spelet som jag presenterar består av ungefär 1400 rader kod, varav ungefär 500 är automatgenererade getter/setters och dylikt. I princip så har jag alltså manuellt skrivit ungefär 900 rader Java-kod på mindre än 50 minuter. Det betyder 22,5 rader per minut. Jag räknar med i genomsnitt ungefär 40 tecken per rad, vilket då resulterar i att jag måste slå 720 slag på tangentbordet varje minut i 50 minuter för att hinna med alltihop. Jag läste på Wikipedia att den genomsnittlige datoranvändaren skriver mellan 50 och 70 ord per minut, där varje ord är i genomsnitt 5 tecken lång, d.v.s. 350 tecken per minut som mest (världsrekordet ligger på 150 ord-per-minut under 50 minuter, innehas av en Barbara Blackburn). Det är alltså en bra bit från de 720 tecken/minut som jag behöver uppnå. Så hur kan jag hävda att det är möjligt?
Beroende på hur man ser på det så fuskar jag. Jag använder själv IntelliJ IDEA (6.0 för närvarande) för all Java-kodning. Överlägset stöd för code-completion, refactoring, templates och annat trevlig godis för utvecklare. Ta följande exempel; jag ska skapa lägga till en ActionListener på en knapp. Jag har skrivit följande kod och markören står på *.
JButton button = new JButton(”Kör”);
button.addActionListener(*);
Sen långt tillbaka har vi haft grundläggande code-completion där jag skriver variabelns namn, punkt, och sen trycker Ctrl-Space (eller dylikt) och får upp en lista på alla metoder som kan köras på det objektet. IntelliJ tar det hela ett steg längre, nu skriver jag bara följande (i fetstil) och trycker på Ctrl-Shift-Space:
JButton button = new JButton(”Kör”);
button.addActionListener(new );
Resultatet nu är att IntelliJ fattar att det är en ActionListener som ska in där. Den presenterar en lista med alla klasser och interface som skulle passa där (alla klasser som implementerar ActionListener och som ligger i projektets classpath). Nu vill jag inte använda en färdig ActionListener, utan skapa ett anonymt inre objekt. Väljer jag då ActionListener av de alternativ som finns i listan så fixar IntelliJ all boiler-plate kod åt mig automatiskt, resultatet blir alltså, utan att jag behöver skriva ett tecken mer, att jag får följande helt automatiskt (markören hamnar på *):
JButton button = new JButton(”Kör”);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
*
}
});
Detta funkar för alla typer av anonyma inre klasser och även för sånt du skriver själv. Väldigt smidigt alltså. Denna intelligent code-completion fungerar på fler ställen. Definerar jag en variabel av typen Map så räcker det med att jag skriver variabelns namn, ett = tecken och new och IntelliJ ger mig en lista över alla klasser som implementerar Map. Väldigt trevligt.
Detta är bara ett litet smakprov av vad IntelliJ erbjuder dig som kodare. Trivilia saker som ofta kräver mycket manuellt skrivande görs i ett nafs. Refactoring-stödet är smått magiskt och har under de 6-7 år som jag använt IntelliJ väldigt sällan fallerat. Nu vet jag att både Eclipse och NetBeans erbjuder smart code-completion och refactoring, men ingen av dem är ens i närheten av de finesser som IntelliJ har.
Baksidan är att IntelliJ kostar pengar. $499 för att vara exakt. Väl investerade pengar enligt mig. För de som vill testa IntelliJ så kan du ladda hem en trial licens på 30 dagar. Du hittar allt på www.intellij.com.
Hej!
IntelliJ verkar ju onekligen vara en bra editor för Java, om man nu vill koda i det (för de som kan/får välja).
Själv blir jag lite skrämd att man på 50 minuter kan producera 1400 rader, varav 500 är boilerplate, som sedan skall underhållas.
En bra IDE kan ju underlätta jobbet förstås, med refactoring och andra features.
Men hur mycket funktionalitet får man in på dessa 1400 rader? Det som verkar vara förtjusande med IntelliJ är att ännu fler boilerplate-rader blir lättare att skriva. Hur många av raderna gjorde egentligen något?
Och om du lyckas skriva ens 1400 rader varje dag i en månad har du ju producerat 28.000 rader. Det är ju väldigt mycket att ha koll på.
Notera hur diskussionen har flyttats från IntelliJ till Java :)
Jag är väldigt nyfiken på dina synpunkter på detta, inte minst eftersom du verkar vara en professionell javakodare, som troligtvis får underhålla din egen kodbas?
Cheers!
Anledningen att det det tog 50 minuter att skriva det hela beror på att det spel som jag skriver har ganska få funktioner. Man kan navigera runt på en plan yta, primitiv kollisionsdetektering, enkel laddning av modeller samt en scene-graph som endast tillhanadahåller de mest basala funktionerna. Ett helt annat system som skulle hamna på 1400 rader skulle kanske ta flera dagar att skriva, på grund av att det är mycket mer funktionalitet där. Syftet med min presentation är inte i första hand att skriva något snabbt, utan påvisa att det inte är så många olika funktioner som behöver implementeras.
”…utan påvisa att det inte är så många olika funktioner som behöver implementeras.”
Ja precis, och det var lite det jag försökte poängtera.
Spelet tog 50 min att skriva, och resulterade i 1400 rader som nu *någon skall ha koll på, förstå och underhålla*.
Visst, det är imponerande att lyckas få till spelet alls på den tiden, det är tydligt att du vet vad du gör.
Men 1400 rader? De flesta av dem måste ju ha noll intelligens och borde kunna beskrivas enklare?
Känns det aldrig som att det måste finnas något enklare sätt att koda än att trycka ut fler rader kod?
Du är inne på precis samma tankebana som jag är. Ett exempel är att jag laddar 3D-modeller från det s.k. Collada-formatet (Bland annat det format som Sony valde för PS3). Det är ett XML-baserat format som jag laddar genom att jag genererat bönor för det hela med XMLBeans.
Nästa steg är att jag ”automatiskt” kopplar dessa till min scene-graph (det träd som beskriver min 3D-värld) med t.ex. Spring Framework. Då kan jag nog ytterligare kapa bort ~300-400 rader manuellt skriven kod.
Precis som du skriver. Det går att göra enklare, det jag inte kan förstå är varför ingen försökt detta på 3D-applikationer tidigare?
OK, intressant.
Kommer din applikation bli publik efter presentationen den 10e Maj?
Lycka till förresten! :)
Och jag som tycker att Eclipse underlättar förmycket ;-)
//fredrik