Scripting: Do's and Don'ts – Arma Reforger
Jump to navigation
Jump to search
Bovine3dom (talk | contribs) m (Fix broken link) |
Lou Montana (talk | contribs) m (Fix <tt> usage) |
||
Line 73: | Line 73: | ||
|} | |} | ||
Keep a strong reference ( | Keep a strong reference ({{hl|ref}} keyword) to required objects: | ||
{| class="wikitable" style="width: 100%" | {| class="wikitable" style="width: 100%" | ||
! style="width: 50%" | Don't | ! style="width: 50%" | Don't |
Revision as of 17:13, 27 May 2022
Don't | Do |
---|---|
class ExampleClass {
int LProcLgh;
int stringlength( string Value ){
LProcLgh= Value.Length();
Print ( "String length obtained: "+LProcLgh );
return LProcLgh;
}
}
|
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;
}
}
|
Keep variables as close as possible to their usage:
Don't | Do |
---|---|
class ExampleClass
{
protected int m_iLength;
int GetStringLength(string name)
{
m_iLength = name.Length();
Print("String length obtained: " + m_iLength);
return m_iLength;
}
}
|
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;
}
}
|
Keep a strong reference (ref keyword) to required objects:
Don't | Do |
---|---|
// 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
}
|
// 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
}
|
Avoid strong reference cyclic trap:
Don't | Do |
---|---|
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);
}
}
|
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);
}
}
|