Scripting: Do's and Don'ts – Arma Reforger
Don't | Do |
---|---|
<enforce> class ExampleClass { int LProcLgh; int stringlength( string Value ){ LProcLgh= Value.Length(); Print ( "String length obtained: "+LProcLgh ); return LProcLgh; } } </syntaxhighlight> |
<enforce> class ExampleClass { protected int m_iLastProcessedLength; int GetStringLength(string value) { m_iLastProcessedLength = value.Length(); Print("String length obtained: " + m_iLastProcessedLength); return m_iLastProcessedLength; } int GetLastProcessedLength() { return m_iLastProcessedLength; } } </syntaxhighlight> |
Keep variables as close as possible to their usage:
Don't | Do |
---|---|
<enforce> class ExampleClass { protected int m_iLength; int GetStringLength(string name) { m_iLength = name.Length(); Print("String length obtained: " + m_iLength); return m_iLength; } } </syntaxhighlight> |
<enforce> class ExampleClass { // keeping the variable into method scope and away from the instance int GetStringLength(string name) { int length = name.Length(); Print("String length obtained: " + length); return length; } } </syntaxhighlight> |
Keep a strong reference (ref keyword) to required objects:
Don't | Do |
---|---|
<enforce> // this array only lists pointers but does not increase the reference count array<ExampleClass> classArray = new array<ExampleClass>(); for (int i = 0; i < 10; i++) { ExampleClass newInstance = new ExampleClass(); classArray.Insert(newInstance); // newInstance will be deleted at the end of the scope // as there are no references to it } </syntaxhighlight> |
<enforce> // this array keeps strong references to its items array<ref ExampleClass> classArray = new array<ref ExampleClass>(); for (int i = 0; i < 10; i++) { ExampleClass newInstance = new ExampleClass(); classArray.Insert(newInstance); // classArray keeps a strong reference to newInstance - it will not be cleared } </syntaxhighlight> |
Avoid strong reference cyclic trap:
Don't | Do |
---|---|
<enforce> class MainClass { ref SubClass m_subClass; void MainClass() { m_subClass = new SubClass(this); } } class SubClass { ref MainClass m_parent; void SubClass(MainClass parent) { m_parent = parent; } void DoSomething() { Print(m_parent); } } </syntaxhighlight> |
<enforce> class MainClass { ref SubClass m_subClass; void MainClass() { m_subClass = new SubClass(this); } } class SubClass { MainClass m_parent; // ref removed void SubClass(MainClass parent) { m_parent = parent; } void DoSomething() { if (!m_parent) // null safety check { return; } Print(m_parent); } } </syntaxhighlight> |