Jump to content
  • 0

вариант использования синглтона


cyklop77
 Share

Question

помогите пожалуйста разобраться в в вопросе. привожу код на питоне, но сам язык здесь не важен потому что вопрос принципиальный. вот простыня кода, но чтобы ответить на вопрос смотреть его не обязательно:

from datetime import datetime, date, timeimport pprintimport randomclass GameElement(object):  def __init__(self, name):    self.name = nameclass Boat(GameElement):  def __init__(self, name, peoples, speed, color, oars):    GameElement.__init__(self, name)    self.peoples = peoples    self.speed = speed    self.color = color    self.oars = oars    Boat.quantity += 1  quantity = 0  def __str__(self):    return str(self.__class__.__name__) + ': ' + str(self.__dict__)class Raft(GameElement):  def __init__(self, name, peoples, speed, color, sails):    GameElement.__init__(self, name)    self.peoples = peoples    self.speed = speed    self.color = color    self.sails = sails    Raft.quantity += 1  quantity = 0  def __str__(self):    return str(self.__class__.__name__) + ': ' + str(self.__dict__)class BoatsGenerator(object):  def factory(name, peoples, speed, color, oars):    return Boat(name, peoples, speed, color, oars)    class RaftsGenerator(object):  def factory(name, peoples, speed, color, sails):    return Raft(name, peoples, speed, color, sails)class World(object):  def __new__(cls,*dt,**mp):    if cls.obj is None:      cls.obj = object.__new__(cls,*dt,**mp)      World.quantity += 1            World.boats = []      World.rafts = []      colors = {        1: 'red',        2: 'green',        3: 'yellow',        4: 'blue',        5: 'magenta',      }      for i in range(4):        World.boats.append(BoatsGenerator.factory(          name='beda_'+str(i),           peoples=random.randint(5, 10),           speed=(random.randint(5, 10)) * 10,           color=colors[random.randint(1, 5)],           oars=random.randint(0, 2)        ))      for i in range(4):        World.rafts.append(RaftsGenerator.factory(          name='ra_'+str(i),           peoples=random.randint(1, 4),           speed=(random.randint(1, 3)) * 10,           color=colors[random.randint(1, 5)],           sails=random.randint(0, 1)        ))    return cls.obj      obj = None  quantity = 0  def __str__(self):    return str(self.__class__.__name__) + ': ' + str(self.__dict__)if __name__ == '__main__':  world1 = World()  world1.creared_at = datetime.now().strftime("%A, %d. %B %Y %I:%M%p")  print(world1)  print('worlds quantity: ' + str(World.quantity))  for boat in World.boats:    print(boat)  for raft in World.rafts:    print(raft)         

 

здесь происходит приблизительно следующее. я создаю класс с общим для всех потомков свойством. затем классы для потомков, затем для каждого класса потомка фабрику, затем класс синглтон, который создаёт потомков(о которых я сказал чуть выше)

 

я поместил указатели на всех созданных потомков в переменную класса синглтона и в конце скрипты вывел всех потомков так:
 

  for boat in World.boats:    print(boat)  for raft in World.rafts:    print(raft)        

в результате получил в консоль следующий вывод:

(python3_env)kalinin@kalinin ~/python3/python3_files/boats4 $ python index.pyWorld: {'creared_at': 'Saturday, 05. December 2015 09:40AM'}worlds quantity: 1Boat: {'oars': 2, 'peoples': 7, 'speed': 60, 'color': 'blue', 'name': 'beda_0'}Boat: {'oars': 0, 'peoples': 10, 'speed': 100, 'color': 'yellow', 'name': 'beda_1'}Boat: {'oars': 0, 'peoples': 7, 'speed': 60, 'color': 'magenta', 'name': 'beda_2'}Boat: {'oars': 1, 'peoples': 9, 'speed': 60, 'color': 'red', 'name': 'beda_3'}Raft: {'sails': 1, 'peoples': 1, 'speed': 10, 'color': 'magenta', 'name': 'ra_0'}Raft: {'sails': 1, 'peoples': 2, 'speed': 30, 'color': 'blue', 'name': 'ra_1'}Raft: {'sails': 1, 'peoples': 2, 'speed': 10, 'color': 'magenta', 'name': 'ra_2'}Raft: {'sails': 0, 'peoples': 2, 'speed': 10, 'color': 'magenta', 'name': 'ra_3'}

но совесть мне нашёптывает в одно ухо, что хорошо бы сделать по человечьи и, используя self, всех потомков поместить в переменную объекта, а не класса. однако дьявол в другое ухо нашёптывает, что если уж у меня синглтон по определению может существовать только в единственном экземпляре, то вполне допустимо оставить всё как есть(то есть использовать пременную класса)

 

опытные программисты, что посоветуете использовать для хранения указателей? переменную класса или переменную объекта?

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

*Я такой типа доктор в халате и белом колпачке, со стетоскопом на шее.* У меня для тебя плохие новости. У тебя петтерн головного мозга. Это плохое. Есть и положительный момент. У тебя он в зачаточном состоянии и легко поддаётся лечению. Лечить просто:

1. Забываешь про паттерны на время разработки до «бета-версии»

2. Делаешь задачу, исходя из условий и того, что тебе подсказывает мозг

3. Когда функционал готов, ты смотришь код и понимаешь, что большинство его укладывается в те или иные паттерны, потому что так вышло. То, что не укладывается, либо не нужно укладывать вообще, либо нуждается в рефакторинге в принципе.

Link to comment
Share on other sites

  • 0

неее, дядя доктор. я это уже всё проходил давно и в интернетах кучу подобных советов читал. это всё равно что сказать чучмеку: "зачем тебе учиться грамоте? ты подметай, подметай и будешь всегда при деньгах"

 

а задачи конкретной у меня нету. ну разве что ознакомиться с паттернами

Edited by cyklop77
Link to comment
Share on other sites

  • 0
а задачи конкретной у меня нету. ну разве что ознакомиться с паттернами

 

А ты её создай. Самый простейший вариант который часто используют для описания паттернов это стратегия. Есть юниты имеющие общие хар-ки, но при этом каждый вид юнита имеет собственные особенности, а каждая единица является уникальной =)  У каждого юнита есть навыки, у некоторых видов они могут быть одинаковыми, а могут быть уникальные. И т.д.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By kuzia007
      Пример сайта по разработке reactiq точка net 
      Цена на разработку 70 000 рублей. Без дизайна и верстки, от вас нам нужен функционал 
      на фреймворке Lavarel 
      Нужно постараться уложиться в 20 дней по срокам. 
      Работа по Сделке без риска. B и больше ни как. 

      Основные моменты работы сайта: 
      авторизация сайта через стим 
      считывания апи через официальный сайт pubg 
      Трейдов скинов и все остальное не будет! 
      подключить систему оплат 
      создание личного кабинета для пользователя. 
      Есть полное ТЗ проекта, которое мы готовы упрощать на первом этапе.
      Готовы достойно оплачивать ваш труд! 
      Пишите в телеграм @evgensalyah
    • By kuzia007
      Ищем талантливого программиста в игровой проект
      Для разработки игрового проекта требуются талантливые программисты.
      Отличное знание: PHP, JavaScript, Python
      Преимуществом будет если когда-то работали с платформой steam и с голосовым мессенджером Discord.

      Вкратце о проекте: Будет разрабатываться площадка для проведения турниров по играм pubg, dota, cs go.
      Ищем программиста с руками. Не важно какой вы ориентации, вероисповедания и т.д. Нам от вас важен результат!
      Готовы достойно оплачивать ваш труд! 
      Пишите в телеграм @evgensalyah
    • By Кирилл Марченко
      Предлагаю услуги Агентства по развитию бизнеса “НеКидаем.ру”
      Наша компания занимается:
      - Оптимизацией загрузки сайта
      - Созданием Landing Page (посадочной страницы)
      - Аудитом маркетинговой кампании
      - Юзабилити аудит сайта
      - Переводом сайта к адаптивному виду
      - Переводом сайтов на HTTPS
      - Созданием сайтов
      - Продвижением сайта в поисковых системах (SEO)
      - Продвижением в социальных сетях
      - Контекстной рекламой

      Из последних наших проектов:
      биржа рекламы на частных автомобилях;
      биржу спроса, где можно заказывать услуги и товары по собственным ценам;
      агрегатор по грузоперевозкам;
      биржа рекламы в социальных сетях;
      интернет-магазин искусственных цветов;
      интернет-магазин овощей и  фруктов;

      По запросу, готовы предоставить портфолио выполненных проектов.

      Основные технологии, при помощи которых ведется разработка: Django•Python•PostgreSQL•Backbone.js•Ubuntu•Celery •Redis•Rabbitmq•Javascript

      Ждем Ваших откликов на эл. почту info@alfacvet.ru
    • By Кирилл Марченко
      В агентство по развитию бизнеса NeKidaem.ru требуется ответственный и грамотный сотрудник на должность back-end разработчика Python / Django.
      Мы гарантируем крутой воркфлоу, помощь в освоении нового и интересные задачи.
       
      Ты будешь принимать непосредственное участие в разработке проектов уровня сложности:
      jata.ru  - реклама на частных автомобилях;
      cupidus.ru - заказ услуг и товаров по собственным ценам;
      groozgo. ru - агрегатор по грузоперевозкам;
      optostack.ru - оптосток - твой главный инструмент по работе с Avito
       
      Ты будешь работать под управлением разработчика, принимавшего непосредственное и самое активное участие в разработке sociate.ru
       
      У нас есть задачи под любой уровень разработки, а потому если ты:
      junior-разработчик, то пиши нам, мы прокачаем твои навыки под руководством опытного наставника!
      middle-разработчик, тебе гарантированы сложные, интересные задачи, с огромным полем профессионального роста.
      для pro-разработчиков у нас так же есть нетривиальные проекты. Непростые, где понадобиться весь твой опыт и очень интересные. Пиши!
       
      Обязанности:
      - Проектирование и разработка на Python нового функционала;
      - Рефакторинг, унификация и поддержание в работоспособном состоянии имеющейся кодовой базы;
      - Работа в команде, активная работа над интересными и сложными проектами.
       
      Требования:
      - Здоровая инициатива.
      - Ответственность, внимательность, умение признавать свои косяки и их исправлять.
      - Уверенное знание: Django, Django-Rest-Framework, PostgreSQL, Celery;
      - Опыт написания и поддержки тестов (unittest, mock);
      - Владение Linux (Debian / Ubuntu) на уровне уверенного пользователя;
      - Понимание основ Nginx-конфигурирования;
      - Быть на связи в рабочее время;
      - Вести отчет по своим задачам в Trello.
       
      Будет плюсом:
      - Опыт работы по Scrum-методологии, а также применения Continuous Integration (Jenkins, TeamCity);
      - Опыт работы с Ansible, Fabric;
      - Опыт командной работы с Git.
       
      Условия:
      - Обсуждаемый рабочий график.
      На начальный период приемлема частичная занятость, далее полная, т.к. проектов и клиентов у нас всегда очень много.
      - Без проблем удаленная работа.
      - Работа в дружном и технически грамотном коллективе. Владельцы агенства NeKidaem.ru являются менторами и экспертами технопарка и бизнес-инкубатора Ингрия.
       
      Оплата:
      Оклад определяется твоими начальными навыками и определяется после выполнения тестового задания и периодически пересматривается на предмет повышения в зависимости от твоих успехов.
       
      Хочешь занять вакансию разработчика? Тогда сделай 4 простых шага:
       
      1. Резюме отправлять по адресу info@nekidaem.ru с заголовком «Вакансия back-end разработчика Python».
      В отклике на вакансию обязательно должны быть обозначены твои пожелания по оплате и количество рабочих часов в неделю, которые ты сможешь уделять полноценной разработке.
      2. В ответ на твое письмо будет выслано тестовое задание.
      3. Будет весомым плюсом, если к резюме ты приложишь рассказ о себе в свободной форме, логин в скайпе/номер телефона, ссылки на твои профили в вк/фб и гитхабе.
      4. Общаемся лично в скайпе и обсуждаем условия нашего сотрудничества.
    • By twentyfive_agency
      Мы достаточная слаженная команда и работаем как единый механизм.
      Все члены команды обладают достаточной компетенцией, чтобы выполнять работы разного уровня сложности.
      Сейчас у нас в команде:
      4 Технолога/Верстальщика (html5, css3, javascript, reat, angular) 2 Проектировщика/Дизайнера (invision, photoshop, illustrator, sketch) 3 Бэкенд разработчика (php, nodejs, python + работа со всеми известными cms,crm-системами) 4 Мобильных разработчика (1 iOs, 1 Android) 2 Тестировщика Каждый из членов команды четко понимает ответственность за проект!
      Все задачи ведем в Basecamp, Trello и JIRA, и всегда добавляем туда заказчика, чтобы формировалась прозрачность работы.
      Процесс работы по проектам у нас такой:
      Получаем задание Оцениваем сроки и стоимость, предоставляем информацию в электронном виде заказчику. Согласуем эти данные или вносим корректировки. Подписываем договор (с нашей стороны ИП) Получаем аванс по договору Начинаем работу по проекту Ведем разработку проекта Показываем финальную итерацию заказчику и запускаем проект в продакшн. Остаемся довольными сотрудничеством и получаем отзывы по работе, слаженности и о качестве проекта в целом. Рейты работы наших специалистов:
      Проектирование/Дизайн // 700-800 руб/час Верстка/js  // 700-800 руб/час Программирование (бэкенд) // 700-1000 руб/час Тестирование // 400-650 руб/час Разработка приложений (iOS, Android) // 1000-1400 руб/час Мы работаем над тем, чтобы:
      Заказчик всегда был уверен в том, что сроки по проекту не выйдут за согласованные. Заказчик был уверен в том, что качество работ будет проведено на высшем уровне. Заказчик похвалил нас и сказал, что вернется еще или останется с нами на техподдержку. Наши работы:
      http://greenjam.ru http://tuborg.ru http://k1664.ru http://corny.ru http://megalabs.ru http://prostude.net http://ecorse.education http://eqeducation.org http://dadacreative.com http://tfg.ru/ http://pirelli.autonews.ru/ http://id-direct.ru http://localway.ru  
       
      Twenty Five Agency
      twentyfive.agency
      Georgy Pantsulaya, CEO
      via phone: +7-989-536-00-35
      via skype: hello@twentyfive.agency
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy