input: Write a Python function to implement a Caesar Cipher that can encode and decode a given text with a specified shift.
  ```python
  class CaesarCipher:
      def __init__(self, shift):
          self.shift = shift
      
      def encode(self, text):
          encoded_text = ''
          for c in text:
              if c.isalpha():
                  num_shift = ord(c) + self.shift
                  if c.isupper():
                      if num_shift > ord('Z'):
                          num_shift -= 26
                      elif num_shift < ord('A'):
                          num_shift += 26
                  elif c.islower():
                      if num_shift > ord('z'):
                          num_shift -= 26
                      elif num_shift < ord('a'):
                          num_shift += 26
                  encoded_text += chr(num_shift)
              else:
                  encoded_text += c
          return encoded_text
      
      def decode(self, text):
          decoded_text = ''
          for c in text:
              if c.isalpha():
                  num_shift = ord(c) - self.shift
                  if c.isupper():
                      if num_shift > ord('Z'):
                          num_shift -= 26
                      elif num_shift < ord('A'):
                          num_shift += 26
                  elif c.islower():
                      if num_shift > ord('z'):
                          num_shift -= 26
                      elif num_shift < ord('a'):
                          num_shift += 26
                  decoded_text += chr(num_shift)
              else:
                  decoded_text += c
          return decoded_text
  
  cipher = CaesarCipher(3)
  assert cipher.encode('Hello, World!') == 'Khoor, Zruog!'
  assert cipher.decode('Khoor, Zruog!') == 'Hello, World!'
  assert cipher.encode('abcXYZ') == 'defABC'
  assert cipher.decode('defABC') == 'abcXYZ'
output: if c.isupper():
                      if num_shift > ord('Z'):
                          num_shift -= 26
                      elif num_shift < ord('A'):
                          num_shift += 26
                  elif c.islower():
                      if num_shift > ord('z'):
                          num_shift -= 26
                      elif num_shift < ord('a'):
                          num_shift += 26
                  decoded_text += chr(num_shift)
              else:
                  decoded_text += c
          return decoded_text
  
  cipher = CaesarCipher(3)
  assert cipher.encode('Hello, World!') == 'Khoor, Zruog!'
  assert cipher.decode('Khoor, Zruog!') == 'Hello, World!'
  assert cipher.encode('abcXYZ') == 'defABC'
  assert cipher.decode('defABC') == 'abcXYZ'