Большие проекты в PB. Кто нибудь создавал?

Раздел посвящен программированию с использованием Power Basic.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Большие проекты в PB. Кто нибудь создавал?

Сообщение jangle » 10.01.2007 (Ср) 16:44

Поделитесь советами. Как лучше разбивать функциональность на блоки. Какая структура проекта и #include файлов. ООП то нет. Сотни неинкапсулированных функций, десятки глобальных переменных.. Это задница однако! Классы нужны, навигатор проекта и т.д. Все-таки VB IDE не такая уж и плохая штука :?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.01.2007 (Ср) 17:08

jangle
В асме тоже ООП нет. И ничего, пишут. А вообще можно половину раскидать по DLL.
И ещё... Если правильно прикрутить COM, то он вполне годится для ООП.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 10.01.2007 (Ср) 17:45

В асме тоже ООП нет. И ничего, пишут. А вообще можно половину раскидать по DLL


Раскидывать функции по DLL тоже не очень хорошо. Приложение состоящее из россыпи DLL файлов трудно сопровождать и отлаживать.


Если правильно прикрутить COM, то он вполне годится для ООП.


Как он годится? Могу ли я создавать свои классы с функциями?

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Re: Большие проекты в PB. Кто нибудь создавал?

Сообщение volo » 11.01.2007 (Чт) 10:21

jangle писал(а):Поделитесь советами. Как лучше разбивать функциональность на блоки. Какая структура проекта и #include файлов. ООП то нет. Сотни неинкапсулированных функций, десятки глобальных переменных.. Это задница однако! Классы нужны, навигатор проекта и т.д. Все-таки VB IDE не такая уж и плохая штука :?



Да проблема то не в наличии или отсуствия ООП. Тем более еcли все будешь делать сам.

Из рекомендаций для большого проекта, в принципе без 2-3 как минимум DLL не обойдешься. Хотя все зависит от конкретной задачи.

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

Можешь в принципе под каждый условный пункт - отвести #INCLUDE
Имена процедур и переменных пишешь не A,B,C а полностью типа rename_time_value.

одно примечание - существует практика правильного добавления комментариев ко всему тексту, пример:

Код: Выделить всё

'----------------------------------------------------
FUNCTION DSP_PERF_ASSERT_COUNTER ALIAS "DSP_PERF_ASSERT_COUNTER" () EXPORT AS LONG

  'function takes
  ' nothing
  '
  'function returns
  ' long        - %DSP_OK = 0& on success or error code on error
  '
  'notes:         function sets the internal high frequency
  '               performance counter and stores the current
  '               value in a persistent variable. this function
  '               should be called right before any dsp function
  '               the caller wishes to time. right after the
  '               dsp function is complete the caller should
  '               call DSP_PERFORMANCE_COUNT to return the
  '               elapsed time or clocks that the function took.
  '               this function will fail if the hardware does
  '               not support a high frequency performance
  '               counter.

  LOCAL l AS LONG

  IF g_HRPF = 0&& THEN                                ' does this system support the high resolution performance counter?
    FUNCTION = %DSP_ERR_HRPC_NOT_SUPPORTED            ' set error if hrpc does not exist
    EXIT FUNCTION                                     ' return
  END IF

  l = QueryPerformanceCounter(g_HRPC)                 ' get the performance counter
  IF l = 0& THEN                                      ' did the call fail
    FUNCTION = %DSP_ERR_HRPC_CALL                     ' set error code
  END IF

END FUNCTION




Определяешся с перечнем глобальных переменных и структур. Их можно кинуть в главный файл или в один из первых #INCLUDE.
Часть глобальных переменных можно кинуть в глобальные структуры

В #INCLUDE файлах, ну я кидаю где-то в среднем в один файл до 64к кода, хотя бывает и гораздо более.

отладку производишь попроцедурно, по времени добавления того или иного компонента согласно ТЗ

Устанавливаешь в компиляторе
'Set Primary Source FIle'

В принципе ничего особо сложного нет, нужна привычка - "ручной работы".

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 12.01.2007 (Пт) 10:36

Часть глобальных переменных можно кинуть в глобальные структуры


Интересная мысль! Так можно значительно сократить и упорядочить глобальные переменные.

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 12.01.2007 (Пт) 15:30

jangle писал(а):
Часть глобальных переменных можно кинуть в глобальные структуры


Интересная мысль! Так можно значительно сократить и упорядочить глобальные переменные.


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

Отдельно с оставшимися глобальными переменными можно поступить так: разбить их на "системные" и "другие". Т.е. для "системных"
использовать названия с абревеатурой "OS_", например OS_ROTATION_SPEED

а для других - обычные названия типа
FisherManSpeed_Line
или что-то подобное

Я имею ввиду глобальные переменные.
И все постоянные значения - затосовать в %КОНСТАНТЫ

Если делаешь многоязыковый продукт, то продумай использование строковых $CONSTANT либо через выбор, либо через компиляцию.
Константы проекта слей в отдельный #INCLUDE

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Re: Большие проекты в PB. Кто нибудь создавал?

Сообщение PBDN » 13.01.2007 (Сб) 4:08

jangle писал(а):ООП то нет. Сотни неинкапсулированных функций, десятки глобальных переменных.. Это задница однако!


А какая разница, все равно, после компиляции получится не ООП,
ИМХО запись System_Files_... Не намного отличается от System.Files.
Те же самые классы и прочее - это все фикции, которые реально потом приведутся к обыкновенным процедурам. А зарыться в них можно не хуже чем в процедурах.

Самое главное ИМХО в большом проекте сидеть не за компом,
а досканально создать функциональную схему на бумаге,
расписать все по блокам и уже потом реализация.


jangle писал(а):Классы нужны, навигатор проекта и т.д. Все-таки VB IDE не такая уж и плохая штука :?


навигатор проекта = http://www.zippety.net/

и еще прикрепил архивчик, не помню где его надыбал, - примеры реализации ООП, хотя наверное все таки привычка, мне проще создать свои include файлы с именами отвечающими за их назначение.

И бить функции как в ООП

SYS_Files_Open_FileDialog
SYS_Files_Open_BinaryFile

SYS_Registry_Read_KeyValue
SYS_Registry_Write_KeyValue

USER_Hardware_Ctrl_unit01_SendData
USER_Math_xxx

Кстати насчет глобальных переменных ИМХО:
Держать их в отдельном инклуде и вставлять в main-файле в самом начале. Ни в коем случае не создавать глобальных переменных внутри функций. все DIMы обязательно явным видом обьявлять как локальные данные или статик или глобальные. Иначе с с ПБшной политикой можно нарваться на серьёзные проблемы.
Вложения
OOP.ZIP
Примеры ООП
(5.1 Кб) Скачиваний: 171

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.01.2007 (Пн) 18:25

Классы нужны, навигатор проекта и т.д. Все-таки VB IDE не такая уж и плохая штука

навигатор проекта = http://www.zippety.net/

Мне лично Lynx не очень понравился. Есть очень неплохая IDE - SED http://com.it-berater.org/files/SED115.zip
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 16.01.2007 (Вт) 9:35

и еще прикрепил архивчик, не помню где его надыбал, - примеры реализации ООП, хотя наверное все таки привычка, мне проще создать свои include файлы с именами отвечающими за их назначение.


в архиве только include файлы, примеров нет.

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Сообщение PBDN » 16.01.2007 (Вт) 10:05

jangle писал(а):в архиве только include файлы, примеров нет.


I'm sorry, пример ниже
кстати по нему же нашел и источник
http://www.powerbasic.com/support/forum ... 02144.html

Код: Выделить всё
'OOP in PB.bas
'An Introduction to Object Oriented Programming
'By Colin Schmidt, placed into Public Domain 2003-11-21
'Praxis Enterprises, Chilliwack, BC, Canada
'Colin(at)PraxisEnt.com


#COMPILE EXE

#INCLUDE "OOP in PB.inc" 'Win32API declares, used IncLean

#INCLUDE "Object.inc"
#INCLUDE "ObjectOne.inc"        'Parent, has lMyVar1 and lMyVar2
#INCLUDE "ObjectTwo.inc"        'Second Parent, has lMyVar3 and lMyVar4
#INCLUDE "ObjectOne_A.inc"      'Example of Child, has spMyVar1 and spMyVar2
#INCLUDE "ObjectOne_A_A.inc"    'Example of Grandchild, has spMyVar 1,2,3,4
#INCLUDE "ObjectOneWithTwo.inc" 'Example of Child with two Parents, has lMyVar 1,2,3,4


FUNCTION PBMAIN
    LOCAL loObjBasic      AS oObject
    LOCAL loObjOne        AS oObjectOne
    LOCAL loObjTwo        AS oObjectTwo
    LOCAL loObjOne_A      AS oObjectOne_A
    LOCAL loObjOne_A_A    AS oObjectOne_A_A
    LOCAL loObjOneWithTwo AS oObjectOneWithTwo


    loObjBasic = NewObject
    IF loObjBasic = %False THEN : MSGBOX "Failed to create Object" : EXIT FUNCTION

    loObjOne = NewObjectOne
    IF loObjOne = %False THEN : MSGBOX "Failed to create ObjectOne" : EXIT FUNCTION

    loObjTwo = NewObjectTwo
    IF loObjTwo = %False THEN : MSGBOX "Failed to create ObjectTwo" : EXIT FUNCTION

    loObjOne_A = NewObjectOne_A
    IF loObjOne_A = %False THEN : MSGBOX "Failed to create ObjectOne_A" : EXIT FUNCTION

    loObjOne_A_A = NewObjectOne_A_A
    IF loObjOne_A_A = %False THEN : MSGBOX "Failed to create ObjectOne_A_A" : EXIT FUNCTION


    loObjOneWithTwo = NewObjectOneWithTwo
    IF loObjOneWithTwo = %False THEN : MSGBOX "Failed to create ObjectOneWithTwo" : EXIT FUNCTION



    'Test Object
    MSGBOX FORMAT$(@loObjBasic.lActive), ,        "@loObjBasic.lActive = 1"

    'Test ObjectOne
    MSGBOX FORMAT$(@loObjOne.lMyVar1), ,          "@loObjOne.lMyVar1 = 1"
    @loObjOne.lMyVar1 = 3
    MSGBOX FORMAT$(@loObjOne.lMyVar1), ,          "@loObjOne.lMyVar1 = 3"
    MSGBOX FORMAT$(@loObjOne.lMyVar2), ,          "@loObjOne.lMyVar2 = 2"
    mObjCall(loObjOne, @loObjOne.eSet2From1, 0)
    MSGBOX FORMAT$(@loObjOne.lMyVar2), ,          "@loObjOne.lMyVar2 = 3"

    'Test ObjectTwo
    MSGBOX FORMAT$(@loObjTwo.lMyVar3), ,          "@loObjTwo.lMyVar3 = 3"
    MSGBOX FORMAT$(@loObjTwo.lMyVar4), ,          "@loObjTwo.lMyVar4 = 4"
    mObjCall(loObjTwo, @loObjTwo.eSet4From3, 0)
    MSGBOX FORMAT$(@loObjTwo.lMyVar4), ,          "@loObjTwo.lMyVar4 = 3"

    'Test ObjectOne_A
    MSGBOX @loObjOne_A.@spMyVar1, ,               "@loObjOne_A.@spMyVar1 = 1"
    MSGBOX @loObjOne_A.@spMyVar2, ,               "@loObjOne_A.@spMyVar2 = 2"
    mObjCall(loObjOne_A, @loObjOne_A.eSet2From1, 0)
    MSGBOX @loObjOne_A.@spMyVar2, ,               "@loObjOne_A.@spMyVar2 = 1"

    'Test ObjectOne_A_A
    MSGBOX @loObjOne_A_A.@spMyVar1, ,             "@loObjOne_A_A.@spMyVar1 = 1"
    MSGBOX @loObjOne_A_A.@spMyVar2, ,             "@loObjOne_A_A.@spMyVar2 = 2"
    MSGBOX @loObjOne_A_A.@spMyVar3, ,             "@loObjOne_A_A.@spMyVar3 = three"
    MSGBOX @loObjOne_A_A.@spMyVar4, ,             "@loObjOne_A_A.@spMyVar4 = four"
    mObjCall(loObjOne_A_A, @loObjOne_A_A.eSet4From1, 0)
    MSGBOX @loObjOne_A_A.@spMyVar4, ,             "@loObjOne_A_A.@spMyVar4 = 1"
    mObjCall(loObjOne_A_A, @loObjOne_A_A.eSet2From1, 0)
    MSGBOX @loObjOne_A_A.@spMyVar2, ,             "@loObjOne_A_A.@spMyVar2 = 1"

    'Test ObjectOneWithTwo
    MSGBOX @loObjOneWithTwo.@spName, ,            "@loObjOneWithTwo.@spName = no name"
    @loObjOneWithTwo.@spName = INPUTBOX$("Your first and last name in lowercase:", _
                                        "@loObjOneWithTwo.@spName", _
                                        @loObjOneWithTwo.@spName)
    mObjCall(loObjOneWithTwo, @loObjOneWithTwo.eSetMCase, 0)
    MSGBOX @loObjOneWithTwo.@spName, ,            "@loObjOneWithTwo.@spName = Your Name"
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar1), , "@loObjOneWithTwo.@lpMyVar1 = 1"
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar2), , "@loObjOneWithTwo.@lpMyVar2 = 2"
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar3), , "@loObjOneWithTwo.@lpMyVar3 = 3"
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar4), , "@loObjOneWithTwo.@lpMyVar4 = 4"
    mObjCall(loObjOneWithTwo, @loObjOneWithTwo.eSet2From1, 0)
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar2), , "@loObjOneWithTwo.@lpMyVar2 = 1"
    mObjCall(loObjOneWithTwo, @loObjOneWithTwo.eSet4From3, 0)
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar4), , "@loObjOneWithTwo.@lpMyVar4 = 3"
    mObjCall(loObjOneWithTwo, @loObjOneWithTwo.eSet4From1, 0)
    MSGBOX FORMAT$(@loObjOneWithTwo.@lpMyVar4), , "@loObjOneWithTwo.@lpMyVar4 = 1"



    KillObject           loObjBasic
    KillObjectOne        loObjOne
    KillObjectTwo        loObjTwo
    KillObjectOne_A      loObjOne_A
    KillObjectOne_A_A    loObjOne_A_A
    KillObjectOneWithTwo loObjOneWithTwo

END FUNCTION


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

    TopList