Вызов методов условно из двух разных классов - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть два класса ExceptionLog и DebugLog.

public class ExceptionLog {
    public static String StackTrace {get; set;}
    public static String ClassName {get; set;}
    public static String MethodName {get; set;}
    public static String LogType {get;set;}
    public static Exception ex {get;set;}

    public Static void Debug(Exception ex)
    {
        logType = 'EXCEPTION'; 
        ex = ex;
        log();
    }

    public Static void log()
    {
        try
        {
            extractException(); 
            writeToObject(); 

        }
        catch(Exception e)
        {
            //new ExceptionLog().Module('LogException').log(e);            
        }    
    }

    public static void extractException()
    {
        // Logic here            
    }

    public static void writeToObject()
    {        
        // data save to object logic here       
    }    
}

и

public class DebugLog {
    public static String LogType {get;set;}
    public static String DebugMessage {get;set;} 

    public Static void Debug(String message)
    {
        Debug(null, message);
    }

    public Static void Debug(LoggingLevel level, String message)
    {
        if(level != null )
        {
            LogType = String.valueOf(level);             
        }        

        DebugMessage = message;

        log();
    }

    public Static void log()
    {
        // Log logic here   
    }        

}

То, чего я хочу достичь, - написать класс контроллера, который решит, какой debug метод должен быть вызван

public class Log {
    public void Debug(String message)
    {
        DebugLog.Debug(message);
    }
    public void Debug(loggingLevel loggingLevel, String message)
    {
        DebugLog.Debug(loggingLevel, message);    
    }
    public void Debug(Exception ex)
    {
        ExceptionLog.Debug(ex);
    }
}

То есть, если я передам исключение в методе отладки, он вызовет ExceptionLog.Debug(ex), иначе он вызовет метод отладки из DebugLog класса.

Как мне разработать классы более элегантно, или какой-либо шаблон дизайна здесь подходит?

1 Ответ

1 голос
/ 05 марта 2020

Вы можете отправить нетипизированный аргумент и найти тип в классе Log, как показано ниже:

public class Log {
    public void debug(Object genericLog){
        if(genericLog instanceof String){
            DebugLog.Debug(String.valueOf(message));
        }
        else if(genericLog instanceof Exception){
            ExceptionLog.Debug((Exception)genericLog);
        }
        else if(genericLog instanceof DebugWrapper){
            DebugWrapper wrapper = (DebugWrapper)genericLog;
            DebugLog.Debug(wrapper.loggingLevel, wrapper.message);
        }
        else{
            //do whatever
        }
    }

    public void debug(String message, LoggingLevel loggingLevel){
        debug(wrapLog(message, loggingLevel));
    }

    public class DebugWrapper{
        public String message;
        public LoggingLevel loggingLevel;

        public DebugWrapper(String message, LoggingLevel loggingLevel){
            this.message = message;
            this.loggingLevel = loggingLevel;
        }
    }

    public DebugWrapper wrapLog(String message, LoggingLevel loggingLevel){
        return new DebugWrapper(message, loggingLevel);
    }
}

В качестве альтернативы, вы можете реализовать интерфейс Apex Callable, который предназначен для обработки карты обобщенные c аргументы. В вашем классе определен метод call(String action, Map<String, Object> args). Пропуск действия через регистр переключателя определяет, какой метод вызывается.

...