আমি এই বিষয় সম্পর্কে অতীতে বেশ কিছু পড়েছি এবং চাচা ববসের মতো এই মত কিছু আকর্ষণীয় আলোচনা দেখেছি । তবুও, আমি সর্বদা আমার ডেস্কটপ অ্যাপ্লিকেশনগুলিকে সঠিকভাবে স্থপতি করা এবং ইউআই পার্শ্বে কোনটি দায়বদ্ধ হওয়া উচিত এবং লজিকের দিকগুলির মধ্যে কোনটি আলাদা করা উচিত তা পৃথক করে তুলতে আমার পক্ষে খুব কঠিন ।
ভাল অনুশীলনের খুব সংক্ষিপ্তসার এইরকম কিছু। আপনি আপনার যুক্তিটি ইউআই থেকে ডিকপলড ডিজাইন করা উচিত, যাতে আপনি আপনার গ্রন্থাগারটি (তাত্ত্বিকভাবে) কোনও ধরণের ব্যাকএন্ড / ইউআই কাঠামোই বিবেচনা না করে ব্যবহার করতে পারেন। এর অর্থ যা মূলত ইউআইটি যতটা সম্ভব ডামি হওয়া উচিত এবং ভারী প্রসেসিংটি যুক্তির দিকে করা উচিত। অন্যথায় বলেছে, আমি আক্ষরিকভাবে আমার দুর্দান্ত লাইব্রেরিটি কনসোল অ্যাপ্লিকেশন, একটি ওয়েব অ্যাপ্লিকেশন বা একটি ডেস্কটপ ব্যবহার করতে পারি।
এছাড়াও, চাচা বব কোন প্রযুক্তি ব্যবহার করবেন তা আপনাকে বিভিন্ন উপকারিতা (ভাল ইন্টারফেস) দেবে তার বিবিধ আলোচনার পরামর্শ দেয়, মুলতুবি করার এই ধারণাটি আপনাকে অত্যন্ত ডিকম্পলড ভাল-পরীক্ষিত সত্তাগুলি রাখতে দেয়, এটি দুর্দান্ত শোনাচ্ছে তবে তবুও জটিল y
সুতরাং, আমি জানি এই প্রশ্নটি বেশ বিস্তৃত প্রশ্ন যা পুরো ইন্টারনেট এবং অনেক ভাল বইতেও বহুবার আলোচিত হয়েছে। সুতরাং এর থেকে ভাল কিছু পাওয়ার জন্য আমি পাইকিটিতে এমসিসি ব্যবহার করার চেষ্টা করার একটি খুব ছোট্ট ছদ্মবেশী উদাহরণ পোস্ট করব:
import sys
import os
import random
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import QtCore
random.seed(1)
class Model(QtCore.QObject):
item_added = QtCore.pyqtSignal(int)
item_removed = QtCore.pyqtSignal(int)
def __init__(self):
super().__init__()
self.items = {}
def add_item(self):
guid = random.randint(0, 10000)
new_item = {
"pos": [random.randint(50, 100), random.randint(50, 100)]
}
self.items[guid] = new_item
self.item_added.emit(guid)
def remove_item(self):
list_keys = list(self.items.keys())
if len(list_keys) == 0:
self.item_removed.emit(-1)
return
guid = random.choice(list_keys)
self.item_removed.emit(guid)
del self.items[guid]
class View1():
def __init__(self, main_window):
self.main_window = main_window
view = QtWidgets.QGraphicsView()
self.scene = QtWidgets.QGraphicsScene(None)
self.scene.addText("Hello, world!")
view.setScene(self.scene)
view.setStyleSheet("background-color: red;")
main_window.setCentralWidget(view)
class View2():
add_item = QtCore.pyqtSignal(int)
remove_item = QtCore.pyqtSignal(int)
def __init__(self, main_window):
self.main_window = main_window
button_add = QtWidgets.QPushButton("Add")
button_remove = QtWidgets.QPushButton("Remove")
vbl = QtWidgets.QVBoxLayout()
vbl.addWidget(button_add)
vbl.addWidget(button_remove)
view = QtWidgets.QWidget()
view.setLayout(vbl)
view_dock = QtWidgets.QDockWidget('View2', main_window)
view_dock.setWidget(view)
main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, view_dock)
model = main_window.model
button_add.clicked.connect(model.add_item)
button_remove.clicked.connect(model.remove_item)
class Controller():
def __init__(self, main_window):
self.main_window = main_window
def on_item_added(self, guid):
view1 = self.main_window.view1
model = self.main_window.model
print("item guid={0} added".format(guid))
item = model.items[guid]
x, y = item["pos"]
graphics_item = QtWidgets.QGraphicsEllipseItem(x, y, 60, 40)
item["graphics_item"] = graphics_item
view1.scene.addItem(graphics_item)
def on_item_removed(self, guid):
if guid < 0:
print("global cache of items is empty")
else:
view1 = self.main_window.view1
model = self.main_window.model
item = model.items[guid]
x, y = item["pos"]
graphics_item = item["graphics_item"]
view1.scene.removeItem(graphics_item)
print("item guid={0} removed".format(guid))
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
# (M)odel ===> Model/Library containing should be UI agnostic, right now it's not
self.model = Model()
# (V)iew ===> Coupled to UI
self.view1 = View1(self)
self.view2 = View2(self)
# (C)ontroller ==> Coupled to UI
self.controller = Controller(self)
self.attach_views_to_model()
def attach_views_to_model(self):
self.model.item_added.connect(self.controller.on_item_added)
self.model.item_removed.connect(self.controller.on_item_removed)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
form = MainWindow()
form.setMinimumSize(800, 600)
form.show()
sys.exit(app.exec_())
উপরের স্নিপেটে প্রচুর ত্রুটি রয়েছে, ইউআই কাঠামোর (কিউবজেক্ট, পাইক্ট সংকেত) একত্র হয়ে মডেলটি আরও স্পষ্টভাবে প্রকাশিত। আমি জানি যে উদাহরণটি সত্যই ডামি এবং আপনি একটি একক কিউমেন উইন্ডো ব্যবহার করে কয়েকটি লাইনে কোড করতে পারেন তবে আমার উদ্দেশ্যটি কীভাবে একটি বৃহত পাইক্ট অ্যাপ্লিকেশনটি সঠিকভাবে স্থপতি করা যায় তা বোঝা।
প্রশ্ন
ভাল সাধারণ অভ্যাস অনুসরণ করে আপনি কীভাবে সঠিকভাবে একটি বড় পাইকিউটি অ্যাপ্লিকেশনটি স্থপতি করতে পারেন?
তথ্যসূত্র
আমি এখানে এটি একটি অনুরূপ প্রশ্ন করেছি