Menu
CoddyTech

Penyembunyian Informasi

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 30 dari 64.

Penyembunyian informasi membatasi akses langsung ke komponen object, sehingga semua interaksi harus dilakukan melalui antarmuka yang terdefinisi dengan baik. Hal ini melindungi data internal dari akses tanpa izin.

Berikut contoh class dengan berbagai tingkat penyembunyian informasi:

class BankAccount:
    def __init__(self, owner, initial_balance):
        self.owner = owner                    # Publik: bisa diakses langsung
        self._balance = initial_balance       # Terlindungi: untuk penggunaan internal
        self.__account_number = "ACC123456"   # Privat: tersembunyi dari luar

Tambahkan method yang menyediakan akses terkendali ke data tersembunyi:

class BankAccount:
    def __init__(self, owner, initial_balance):
        self.owner = owner
        self._balance = initial_balance
        self.__account_number = "ACC123456"
        
    def deposit(self, amount):
        if amount > 0:
            self._balance += amount
            return True
        return False
    
    def withdraw(self, amount):
        if amount > 0 and amount <= self._balance:
            self._balance -= amount
            return True
        return False
    
    def get_balance(self):
        return self._balance
    
    def get_account_info(self):
        # Cara aman untuk menampilkan sebagian data privat
        return f"Owner: {self.owner}, Account: ***{self.__account_number[-4:]}"

Gunakan class melalui antarmuka publiknya:

account = BankAccount("Alice", 1000)

Akses data publik secara langsung:

print(account.owner)  # Alice, akses publik diperbolehkan

Gunakan method yang terkontrol untuk data yang dilindungi:

print(account.get_balance())  # 1000, akses terkendali
account.deposit(500)
print(account.get_balance())  # 1500, saldo berubah dengan aman

Coba akses data tersembunyi:

print(account.get_account_info())  # Pemilik: Alice, Rekening: ***3456
# print(account.__account_number)  # AttributeError: tersembunyi

Atribut privat mengalami name mangling, tetapi secara teknis masih dapat diakses:

# Ini berfungsi, tetapi melanggar prinsip penyembunyian informasi:
print(account._BankAccount__account_number)  # ACC123456

Output:

Alice
1000
1500
Owner: Alice, Account: ***3456
ACC123456

Poin Penting: Penyembunyian informasi melindungi data internal dengan menjadikannya private atau protected, lalu menyediakan akses yang terkendali melalui method public. Hal ini mencegah manipulasi langsung terhadap data sensitif dan memastikan integritas data melalui validasi dalam method akses.

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan menerapkan sistem pesan aman dengan pengujian menyeluruh untuk memvalidasi solusimu.

Kamu perlu mengedit securemessenger.py untuk menerapkan class SecureMessenger sesuai prinsip penyembunyian informasi. File ini berisi komentar TODO terperinci sebagai panduan penerapanmu.

Persyaratan utama meliputi:

  • Enkapsulasi kredensial dan pesan yang tepat
  • Autentikasi sebelum mengizinkan operasi pesan
  • Pemantauan keamanan melalui pelacakan percobaan login
  • Pesan pengembalian yang tepat sesuai spesifikasi di TODO

Coba sendiri

from securemessenger import SecureMessenger

# Penangan kasus uji
test_case = input()
if test_case == "default_test":
    # Kasus uji standar dari soal asli
    messenger = SecureMessenger("user1")
    
    # Coba tambahkan pesan sebelum login
    print(messenger.add_message("Hello World!"))
    print(messenger.add_message("Secure Message"))
    
    # Coba login dengan kata sandi yang salah
    print(messenger.login("wrong_pass"))
    
    # Login dengan kata sandi yang benar
    print(messenger.login("secure123"))
    
    # Tambahkan pesan setelah berhasil login
    print(messenger.add_message("Hello World!"))
    print(messenger.add_message("Secure Message"))
    
    # Ambil pesan
    print(messenger.get_messages())
    
    # Periksa percobaan login
    print(messenger.get_login_attempts())
elif test_case == "custom_password":
    # Uji dengan kata sandi khusus
    messenger = SecureMessenger("admin", "admin123")
    print(messenger.login("wrong_password"))
    print(messenger.login("admin123"))
    print(messenger.get_login_attempts())
elif test_case == "multiple_login_attempts":
    # Uji beberapa percobaan login
    messenger = SecureMessenger("user2")
    print(messenger.login("attempt1"))
    print(messenger.login("attempt2"))
    print(messenger.login("attempt3"))
    print(messenger.login("secure123"))
    print(messenger.get_login_attempts())
elif test_case == "message_management":
    # Pengelolaan Test message
    messenger = SecureMessenger("user3")
    print(messenger.login("secure123"))
    
    # Tambahkan beberapa pesan
    messages = ["Message 1", "Message 2", "Message 3", "Message 4", "Message 5"]
    for msg in messages:
        print(messenger.add_message(msg))
    
    # Periksa semua pesan
    print(messenger.get_messages())
elif test_case == "empty_messages":
    # Uji kasus pesan kosong
    messenger = SecureMessenger("user4")
    print(messenger.login("secure123"))
    print(messenger.get_messages())
elif test_case == "access_without_login":
    # Uji akses tanpa login
    messenger = SecureMessenger("user5")
    print(messenger.add_message("Unauthorized message"))
    print(messenger.get_messages())
elif test_case == "attribute_privacy":
    # Uji privasi atribut
    messenger = SecureMessenger("user6")
    
    # Atribut publik
    print(f"Public username: {messenger.username}")
    
    # Atribut privat: ini seharusnya memunculkan AttributeError
    try:
        print(messenger.__password)
    except AttributeError as e:
        print("Password is private: AttributeError")
    
    try:
        print(messenger.__messages)
    except AttributeError as e:
        print("Messages are private: AttributeError")
    
    try:
        print(messenger.__login_attempts)
    except AttributeError as e:
        print("Login attempts are private: AttributeError")
    
    try:
        print(messenger.__is_logged_in)
    except AttributeError as e:
        print("Login status is private: AttributeError")
elif test_case == "login_logout_sequence":
    # Pengujian ini mengharuskan kamu memperluas class dengan method logout
    # Untuk pengujian, kita akan membuat subclass dengan fungsi logout
    class ExtendedMessenger(SecureMessenger):
        def logout(self):
            self._SecureMessenger__is_logged_in = False
            return "Logged out successfully"
    
    messenger = ExtendedMessenger("user7")
    print(messenger.login("secure123"))
    print(messenger.add_message("Test message"))
    print(messenger.get_messages())
    print(messenger.logout())
    print(messenger.get_messages())
elif test_case == "stress_test":
    # Uji beban dengan banyak pesan
    messenger = SecureMessenger("user8")
    print(messenger.login("secure123"))
    
    # Tambahkan 100 pesan
    for i in range(1, 101):
        messenger.add_message(f"Message {i}")
    
    # Periksa jumlah pesan
    messages = messenger.get_messages()
    newline_char = '\n'  # Simpan karakter baris baru dalam variabel
    message_count = len(messages.split(newline_char))
    print(f"Added 100 messages. Retrieved {message_count} messages.")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online