Duplicate code

   

Scope: managed applications, mobile applications, and ordinary applications.

1. Code duplication is a development approach when, to develop new features, the developer copies existing code fragments or whole procedures and functions.

Duplicate code might bring about some issues regarding application maintenance:

  • Duplicated code inherits the mistakes from the original.
  • When you fix coding mistakes, you might overlook the same mistakes in duplicates.
  • Debugging takes more time.
  • The application architecture gets more complicated.

Usually, you have to duplicate code when you cannot address it from other parts of the applications. For example, the code is embedded in a form module, and you want another form to call it.

It is recommended that you avoid code duplications whenever possible. The best way to avoid code duplication is to refactor code. For example, to make form's procedures and functions accessible, move them from the form module to a common module.

2. It is recommended that you duplicate code only if later you plan to upgrade the duplicate to serve different feature.

How to avoid duplication for server/client functions

For example, in the CommonClientServer module, you want the MessageToUser function to process input parameters differently when it is called from server-side.

To do so, do not use preprocessor commands, like #If NOT ThinClient AND NOT WebClient. Incorrect:

Procedure MessageToUser(Val UserMessageText, Val DataKey = Undefined, Val Field = "", Cancel = False) Export

 Message = New UserMessage;
 Message.Text = UserMessageText;
 Message.Field = Field;

 IsObject = False;

 #If NOT ThinClient AND NOT WebClient Then
 If DataKey <> Undefined
 AND XMLTypeOf(DataKey) <> Undefined Then
 ValueTypeAsString = XMLTypeOf(DataKey).TypeName;
 IsObject = StrFind(ValueTypeAsString, "Object.") > 0;
 EndIf;
 #EndIf

 If IsObject Then
 Message.SetData (DataKey);
 Else
 Message.DataKey = DataKey;
 EndIf;

 Message.Message();
 Cancel = True;

 EndProcedure

The proper solution would be creating two procedures—one for client-side, one for server-side—with the same name, but different behavior. The common code, which is called by both procedures, should be placed in a client/server common module:

i) Server-side procedure:

Procedure MessageToUser(Val UserMessageText, Val DataKey = Undefined, Val Field = "", Cancel = False) Export

 IsObject = False;
 If DataKey <> Undefined
 And XMLTypeOf(DataKey) <> Undefined Then

 ValueTypeAsString = XMLTypeOf(DataKey).TypeName;
 IsObject = StrFind(ValueTypeAsString, "Object.") > 0;
 EndIf;

 CommonInternalClientServer.MessageToUser(UserMessageText, DataKey, Field, Cancel, IsObject);

 EndProcedure

ii) Client-side procedure:

Procedure MessageToUser(Val UserMessageText, Val DataKey = Undefined, Val Field = "", Cancel = False) Export

 CommonInternalClientServer.MessageToUser(UserMessageText, DataKey, Field, Cancel);

 EndProcedure

iii) Common client/server procedure in the CommonInternalClientServer module:

Procedure MessageToUser(Val UserMessageText, Val DataKey, Val Field , Cancel = False, IsObject = False) Export

 Message = New UserMessage;
 Message.Text = UserMessageText;
 Message.Field = Field;

 If IsObject Then
 Message.SetData(DataKey);
 Else
 Message.DataKey = DataKey;
 EndIf;

 Message.Message();
 Cancel = True;

 EndProcedure

See also:

   

Icon/Social/001 Icon/Social/006 Icon/Social/005 Icon/Social/004 Icon/Social/002