Click here to Skip to main content
13,903,180 members
Click here to Skip to main content
Add your own
alternative version

Stats

44K views
180 downloads
13 bookmarked
Posted 9 Jan 2006
Licenced

Dynamic Switch-Case Design Pattern

, 9 Jan 2006
Rate this:
Please Sign up or sign in to vote.
This design pattern solves the problem of having to implement huge switch - case statements and makes dynamic switch - case not dependent on the number of cases.

Overview

This design pattern solves the problem of having to implement huge switch - case statements and makes dynamic switch - case not dependent on the number of cases.

Problem Description

If we have a program used for interpreting and executing commands, as like a Linux shell, and if we assume that we have 300 commands that needs to interpreted and executed, we would need to make a switch - case statement containing 300 cases, and what if we have more than 300 commands? Then, we would need more than 300 cases to handle all those commands. Here, we make a Design Pattern to solve this problem.

Design Pattern Steps

Step 1

Create for every case, only one separate function to handle all the logic of the case.

void  HandleCase1 (int caseNumber) 
{
    printf(" The Handled Case Number Is = %d",caseNumber);
}
void  HandleCase2 (int caseNumber) 
{
    printf(" The Handled Case Number Is = %d",caseNumber);
}
void  HandleCase3 (int caseNumber) 
{
    printf(" The Handled Case Number Is = %d",caseNumber);
}

Put all of above function into a separate file and name it as HandleCases.cpp.

Step 2

Compile the above file as a shared object (dynamic library) using the following commands:

  1. g++ -c -fpic HandleCases.cpp

    The above command generates an object file HandleCases.o.

  2. g++ -shared -lc -o HandleCases.so HandleCases.o

    Now, we have a dynamic library containing all the case implementations.

Step 3

Create your main application where we will use this library instead of switch-cases.

  1. Define a handle to our dynamic library.
    void* FunctionLib;
  2. Define a pointer to the called function.
    void  (*Function)(int);
  3. Open the dynamic library using the dlopen function.
    FunctionLib = dlopen("dynamic library path", RTLD_LAZY);
  4. Get the desired function pointer using the dlsym function.
    Function =(void(*)(int))dlsym( FunctionLib, "HandleCase1");
  5. Call this function using the above function pointer.
    (*Function)(1);
  6. Finally, close the dynamic library.
    dlclose(FunctionLib);

Complete Code of Step 3

#include <span class="code-keyword"><stdlib.h></span>
#include <span class="code-keyword"><stdio.h></span>
#include <span class="code-keyword"><dlfcn.h> // </span>
int main(int argc,char*argv[])
{
    // handle to Dynamic Libary
    void* FunctionLib; 

    // Pointer to called function
    void  (*Function)(int); 

    // Pointer to read the error
    char *error; 

    // Open Dynamic Loadable Libary with absolute path 
    FunctionLib = dlopen("HandleCases.so",RTLD_LAZY);
    
    if ((error = dlerror()) != NULL)
    {
        printf ("%s \n", error);
        exit(1);
    }

    // point to our function need to call
    Function =(void(*)(int))dlsym( FunctionLib, "HandleCase1"); 

    if ((error = dlerror()) != NULL) 
    {
        printf ("%s\n", error);
        exit(1);
    }

    // call our function
    (*Function)(1);

    // close Dynamic libary
    dlclose(FunctionLib); 

    return (0);
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

samadony
Egypt Egypt
No Biography provided

You may also be interested in...

Comments and Discussions

 
GeneralMore discussion needed Pin
Khazbak27-Jan-06 4:24
memberKhazbak27-Jan-06 4:24 
GeneralWhy I voted you a 1 Pin
Jim Crafton11-Jan-06 5:49
memberJim Crafton11-Jan-06 5:49 
GeneralCommand design pattern Pin
Daniel Turini9-Jan-06 9:43
memberDaniel Turini9-Jan-06 9:43 
Questionhuh ? Pin
Maximilien9-Jan-06 9:37
memberMaximilien9-Jan-06 9:37 
AnswerRe: huh ? Pin
Jon Weir10-Jan-06 3:21
memberJon Weir10-Jan-06 3:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web03 | 2.8.190306.1 | Last Updated 9 Jan 2006
Article Copyright 2006 by samadony
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid