


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

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

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

jangle писал(а):Часть глобальных переменных можно кинуть в глобальные структуры
Интересная мысль! Так можно значительно сократить и упорядочить глобальные переменные.

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

Классы нужны, навигатор проекта и т.д. Все-таки VB IDE не такая уж и плохая штука
навигатор проекта = http://www.zippety.net/

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

jangle писал(а):в архиве только include файлы, примеров нет.
'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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7