PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Coding-Stil und dessen Bedeutung



kartoffel
10.02.2009, 14:19
Hallo meine Lieben :),

in letzter Zeit habe ich vermehrt Quellcode gelesen und dabei bemerkt,
dass in den meisten Fällen der Stil ziemlich Schauderhaft ist.
Deshalb werde ich in diesem Thread versuchen, Tipps zum stilvollen Coding
zu sammeln.

Bitte helft mit und schickt mir eure Tipps und Tricks per PN.
Jetzt geht es aber los:


Tipps und Tricks zum richtigen Coden


Code sinnvoll formatieren

Dieser Punkt ist sehr einfach zu nutzen, hat aber extreme Wirksamkeit:

Anstatt Code einfach Zeile für Zeile untereinander zu schreiben,
macht es Sinn, Leerzeilen, Leerzeichen und Tabs einzustreuen,
um den Text zu strukturieren.

Zum Beispiel ist dieser Code

function funktion1(parameter)
local variable
if variable == 1 then
befehl1
else
befehl2
end
end

function funktion2(parameter)
local variable
if variable == 1 then
befehl1
else
befehl2
end
end

sehr viel lesbarer als

function funktion1(parameter)
local variable
if variable == 1 then
befehl1
else
befehl2
end
end
function funktion1(parameter)
local variable
if variable == 1 then
befehl1
else
befehl2
end
end



Variblennamen

Ein weiterer einfacher Punkt, der eigentlich offensichtlich sein sollte,
der aber immernoch oft vernachlässigt wird.

Gebt euren Variablen sinnvolle Namen, wie

playerID = ply:UniqueID

anstatt

A = ply:UniqueID

Das hat den Effekt, dass ihr euch besser an Namen, Inhalt und Funktion der Variable erinnern könnt.



Kommentare benutzen

Lua bringt, wie andere Skriptsprachen auch, eine Kommentarfunktion mit,
damit ihr eurem Code Anmerkungen und Erläuterungen hinzufügen könnt.
Dies hilft anderen, die aus eurem Code lernen wollen, den Code zu verstehen,
und auch ihr werdet auch nach Jahren noch euren Code verstehen können.

Für Kommentare gibt es folgende Möglichkeiten:

--Einzeiliger Kommentar

/*Kommentar über mehrere Zeilen,
sehr nützlich*/

--[[Alternativer, mehrzeiliger
Kommentar]]

makkurona
10.02.2009, 19:53
Bevor ich mir von jemandem vorschreiben lasse, wie ich meinen Stil zu gestalten habe, höre ich lieber auf.

WeltEnSTurm
10.02.2009, 19:56
soll ja auch 1-line coder geben die zurechtkommen.

kartoffel
10.02.2009, 22:15
Heisst aber nicht, dass dieser Code dann auch leicht lesbar ist.
Außerdem ist das hier ein Leitfaden und kein Regelwerk.

Pac_187
10.02.2009, 22:47
Bevor ich mir von jemandem vorschreiben lasse, wie ich meinen Stil zu gestalten habe, höre ich lieber auf.

Wer schreibt dir denn hier bitte vor wie du zu coden hast?

Es sollen lediglich Tipps sein die dazu beitragen,
dass auch noch andere Entwickler durch deinen Code durchsteigen
und nicht irgend ein "Wollknäuel" vor sich haben....

makkurona
11.02.2009, 15:02
Ich wollte es nur anmerken.
Ich persönlich kommentiere und rücke ein. Das Variablennamen ersichtlich sein sollten ist eigentlich klar. So wie man es auch machen sollte. Aber ich finde, dass jeder seinen eigenen Stil finden sollte.

In Multientwicklerprojekten, ist das wieder etwas anderes, dann sollte man gewisse Grundregeln festmachen, aber ansonsten... Naja. Ich weiß nicht. *zwinker*

kartoffel
11.02.2009, 19:10
Wie gesagt, es sind nur Tipps...
Keine Regeln, solche aufzustellen wär unverschämt.

kycro
13.02.2009, 17:58
Diese Richtlinien haben mir sehr geholfen (und LuaEdit, habe vorher im Windows Editor gecodet)

Scarecrow
14.02.2009, 01:51
Auf der anderen seite wird sowas natürlisch absichtlich gemacht denn man soll den code ja nicht immer nachvollziehen können. Nicht jeder Depp sollte sich daraus einen Vorteil ziehen, schon garnich wenn alles open source ist (ok widerspruch in sich aber ***** =).

BennyG
14.02.2009, 11:10
Auf der anderen seite wird sowas natürlisch absichtlich gemacht denn man soll den code ja nicht immer nachvollziehen können. Nicht jeder Depp sollte sich daraus einen Vorteil ziehen, schon garnich wenn alles open source ist (ok widerspruch in sich aber ***** =).

Den Stimm ich voll zu ;)

Ich Rücke zwar auch ein,aber ich schreibe extra keine Kommentare,wenn doch, dann nur in einer seperaten TextFile,die ich nicht mitveröffentlichen werde.
Wenn man sich doch dieses mit Script-Kiddys überflutete Gmorg anschaut,versucht man schließlich recht häufig den Code so unverständlich wie möglich zu machen.
(Siehe NUKE_V10,NUKE_V2231,NUKE_SUPER_V152_FIX etc)

aVoN
14.02.2009, 18:57
Bevor ich mir von jemandem vorschreiben lasse, wie ich meinen Stil zu gestalten habe, höre ich lieber auf.

Dies sind nur Empfehlungen.

Ich habe schon allzu saumößigen code gesehen.
Man hat förmlich erkannt, dass code-schnippsel aus anderen Projekten einfach per copy&paste kopiert wurde, ohne ihn mal an das layout anzupassen.

Mal ehrlich, findest du

AddCSLuaFile("Client/ClientVehicleScript.lua")
vu_enablehorn = CreateConVar( "vu_enablehorn", "1", { FCVAR_PROTECTED } )
local function SpawnedVehicle(player, vehicle)
local localpos = vehicle:GetPos() local localang = vehicle:GetAngles()
----Add passenger seats
if vehicle.VehicleTable then
if vehicle.VehicleTable.Passengers then
-----Grab the data for the extra seats, we do want the lovely sitting anim dont we.
local SeatName = vehicle.VehicleTable.SeatType

local seatdata = list.Get( "Vehicles" )[ SeatName ]

-----Repeat for each seat.
for a,b in pairs(vehicle.VehicleTable.Passengers) do
local SeatPos = localpos + ( localang:Forward() * b.Pos.x) + ( localang:Right() * b.Pos.y) + ( localang:Up() * b.Pos.z)
local Seat = ents.Create( "prop_vehicle_prisoner_pod" )
Seat:SetModel( seatdata.Model )
Seat:SetKeyValue( "vehiclescript" , "scripts/vehicles/prisoner_pod.txt" )
Seat:SetAngles( localang + b.Ang )
Seat:SetPos( SeatPos )
Seat:Spawn()
Seat:Activate()
Seat:SetParent(vehicle)
if vehicle.VehicleTable.HideSeats then
Seat:SetColor(255,255,255,0)
end
if ( seatdata.Members ) then
table.Merge( Seat, seatdata.Members )
end
if ( seatdata.KeyValues ) then
for k, v in pairs( seatdata.KeyValues ) do
Seat:SetKeyValue( k, v )
end
end
Seat.VehicleName = "Jeep Seat"
Seat.VehicleTable = seatdata
Seat.ClassOverride = "prop_vehicle_prisoner_pod"
Seat:DeleteOnRemove( vehicle )
----------- Replace the position with the ent so we can find it later.
vehicle.VehicleTable.Passengers[a].Ent = Seat
end
end
if vehicle.VehicleTable.HeadLights then
vehicle.HeadLights = {}
local lights = vehicle.VehicleTable.HeadLights
local angles = vehicle:GetAngles()
for a,b in pairs(lights) do
local pos = vehicle:GetPos() + ( angles:Forward() * b.Pos.x ) + ( angles:Right() * b.Pos.y ) + ( angles:Up() * b.Pos.z )
vehicle.HeadLights[a] = ents.Create( "vu_headlight" )
vehicle.HeadLights[a]:SetPos(pos)
vehicle.HeadLights[a]:SetAngles( angles + b.Ang )
vehicle.HeadLights[a]:SetParent(vehicle)
vehicle.HeadLights[a]:Spawn()
vehicle.HeadLights[a]:DeleteOnRemove( vehicle )
end
end
end
end
schön? Da hat "Dark Nova Clan" richtig geschlampt (kommt aus VU-Mod). Einzüge, wo keine reingehören sowie fehlende. Ineffiziente coding-weise (Mehrfach-aufruf von funktionen anstatt nur einmal und den wert in einer lokalen variable speichern).


Dazu gibt es noch schlimmeren code, welcher leerzeichen anstatt tabs benutzt bzw beiders durcheinander.

Und was ich am schlimmsten finde, sind leerzeichen zwischen funktionen-argumenten bzw. dessen inkonsistente verwendung.

Wie vom code oben:
vehicle.HeadLights[a]:SetAngles( angles + b.Ang )
vehicle.HeadLights[a]:SetParent(vehicle)
Wieso wird bei der ersten funktion am anfang und ende ein leerzeichen eingefügt, nicht aber bei der nächsten? Macht die sache "unschön".



Ok, es sind hobby programmierer. Aber selbst als hobby-programmier sollte man erstmal vernünftig coden lernen bevor man etwas anfängt. Sonst wird das Programm extrem unleserlich oder schlechter zu debuggen (was der Hauptgrund ist, wieso man leserlich coden sollte!) und kann im schlimmsten Fall einfach den Rechner einfrieren.


Jeder, der dies nicht erkennt codet grob fahrlässig und sollte lieber die Finger davon lassen.

RP-01
16.02.2009, 13:19
@BennyG
Ich notiere meine sachen auch nicht.

Was ich wichtig finde das man zumindest in einem skript alles einheitlich macht, nicht so wie bei aVoN's letztem Beispiel was eindeutig nach copy'n'paste aussieht.

Mfg,
RP-01

Pac_187
16.02.2009, 16:16
Ich habe mich mal dazu entschieden das ganze anzupinnen,
da es doch schon eine wichtige Rolle beim Scripten spielt ;)

kartoffel
16.02.2009, 19:41
*niederknie*
Vielen Dank, Pac!

MfG kartoffel

Flaver
21.02.2009, 16:36
Hat mir echt geholfen jetzte sieht mein Code schonmal übersichtlicher
aus *gg*

kartoffel
21.02.2009, 16:59
Das freut mich sehr.

MfG kartoffel

RP-01
06.04.2009, 16:19
Um längere Funktion auszuklammern, sodass es auch im Notepad übersichtlicher ist:

--[[ Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8]]
Line 9
Line 10

Pac_187
06.04.2009, 16:21
Da finde ich


/*


WREEE
LINES OF TEXT


*/


wesentlich besser...

RP-01
06.04.2009, 16:28
Ich habs nur geschrieben, da diese Methode vom Notpad auch grün makiert wird.
Die andere hier wird (bei mir zumindest) im Notepad nicht grün makiert.

WeltEnSTurm
06.04.2009, 16:32
Ich habs nur geschrieben, da diese Methode vom Notpad auch grün makiert wird.
Die andere hier wird (bei mir zumindest) im Notepad nicht grün makiert.

Deswegen benutz ich das auch öfter wenn ich mal alternative Funktionen testen will ^.^

kartoffel
06.04.2009, 20:04
Ich ergänze das sofort, danke für die Vorschläge.

SMILIE
07.04.2009, 22:27
Ich habs nur geschrieben, da diese Methode vom Notpad auch grün makiert wird.
Die andere hier wird (bei mir zumindest) im Notepad nicht grün makiert.

Versucht mal das:
http://sourceforge.net/project/showfiles.php?group_id=189927&package_id=265782
bzw.:
http://code.google.com/p/npp-gmod-lua/