Про ООП (название условное, придет t.t и поправит)

Модератор: Модераторы разделов

RuSNoteS
Сообщения: 24

Про ООП

Сообщение RuSNoteS »

(flook @ Среда, 24 Августа 2005, 11:52) писал(а):за использование шаблонов в С

Привидите пример использования шаблонов в Си пожалуйста. Я утверждаю что там нет шаблонов. Так они могут использоваться только в ОО языках - С++, Java? C#
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Про ООП

Сообщение t.t »

(RuSNoteS @ Среда, 24 Августа 2005, 12:33) писал(а):Привидите пример использования шаблонов в Си пожалуйста. Я утверждаю что там нет шаблонов. Так они могут использоваться только в ОО языках - С++, Java? C#
Извините, но я на этом форуме уже видел примеры кода на Си, написанного flook'ом -- и очень грамотные примеры; примеров вашего кода не видел. Так что думаю, он в этом деле более компетентен, нежели вы.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
RuSNoteS
Сообщения: 24

Re: Про ООП

Сообщение RuSNoteS »

Да бесспорно если в syt видели моего кода - то я конечно более слабый программист чем флук.
Я кстати ничего такого и не утверждал - я просто просил привести примеры кода на Си где используются наблоны.
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Про ООП

Сообщение flook »

Да пожалуйста. Шаблон "декоратор". Пусть есть класс window_area:

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

struct window_area {
   /* some fields */
   void (*draw)(struct window_area *, ...);
}

Имеем егоные реализации

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

struct wnd_with_test {
   struct window_area warea;
   /* specific fields */
}

struct wnd_with_scroll {
   struct window_area warea;
   struct window_area *decorated;
   /* specific fields */
}

Прошу заметить, что все структуры В НАЧАЛЕ у меня одинаковы, так что вызвать ->display я могу и имея указатель на wnd_with_sroll - все смещения "совпадут"

Дальше просто:

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

void draw_my_window(struct window_area *wnd)
{
   ...
   wnd->display(wnd)
}


Методы draw:

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

/* for wnd_with_test
viod draw_text_window(struct window_area *wnd)
{
   /* print all text */
}
/* for wnd_with_scroll */
viod draw_scroll_window(struct window_area *wnd)
{
   draw_scroll();
   recalculate_windows_offsets();
   wnd->decorated->draw(wnd->decorated, ...); /* with new offsets */
}


Это самое простое. На самом деле можно сделать децл подругому при объявлении структур - а именно с помощью следующего макроса, взятого из 2.6 ядра

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

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

с его помощью я могу объявить так

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

struct wnd_with_nicelooking_border {
   /* specific fields */
  struct window_area top_wnd;
}

и потом сказать так в методе draw этого класса

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

   ...
   this_wnd = container_of(wnd, struct wnd_with_nicelooking_border, top_wnd);
   ...

и наслаждаться!
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Про ООП

Сообщение ddc »

Для RuSNoteS:
Ну давайте код свой сюда...
Спасибо сказали:
RuSNoteS
Сообщения: 24

Re: Про ООП

Сообщение RuSNoteS »

Для flook:
Но вы же понмаете что приведенный вами код имитация использования шаблонов в Си - так же как и имитация использования классов на этом же языке.

Честно гворя в приведенном коде я так и не увидел реализацию шаблона декоратор.
Скажем вот эталонная (эккелевская) реализция шаблона Декоратор

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

import junit.framework.*;
interface DrinkComponent {
  String getDescription();
  float getTotalCost();
}

class Mug implements DrinkComponent {
  public String getDescription() {
    return "mug";
  }
  public float getTotalCost() {
    return 0;
  }
}
abstract class Decorator implements DrinkComponent
{
  protected DrinkComponent component;
  Decorator(DrinkComponent component) {
    this.component = component;
  }
  public float getTotalCost() {
    return component.getTotalCost();
  }
  public abstract String getDescription();
}

class Espresso extends Decorator {
  private float cost = 0.75f;
  private String description = " espresso";
  public Espresso(DrinkComponent component) {
    super(component);
  }
  public float getTotalCost() {
    return component.getTotalCost() + cost;
  }
  public String getDescription() {
    return component.getDescription() +
      description;
  }
}

class Decaf extends Decorator {
  private String description = " decaf";
  public Decaf(DrinkComponent component) {
    super(component);
  }
  public String getDescription() {
    return component.getDescription() +
      description;
  }
}

class FoamedMilk extends Decorator {
  private float cost = 0.25f;
  private String description = " foamed milk";
  public FoamedMilk(DrinkComponent component) {
    super(component);
  }
  public float getTotalCost() {
    return component.getTotalCost() + cost;
  }
  public String getDescription() {
    return component.getDescription() +
      description;
  }
}

class SteamedMilk extends Decorator {
  private float cost = 0.25f;
  private String description = " steamed milk";
  public SteamedMilk(DrinkComponent component) {
    super(component);
  }
  public float getTotalCost() {
    return component.getTotalCost() + cost;
  }
  public String getDescription() {
   return component.getDescription() +
      description;
 }
}

class Whipped extends Decorator {
  private float cost = 0.25f;
  private String description = " whipped cream";
  public Whipped(DrinkComponent component) {
    super(component);
  }
  public float getTotalCost() {
    return component.getTotalCost() + cost;
  }
  public String getDescription() {
    return component.getDescription() +
      description;
  }
}

class Chocolate extends Decorator {
  private float cost = 0.25f;
  private String description = " chocolate";
  public Chocolate(DrinkComponent component) {
    super(component);
  }
  public float getTotalCost() {
    return component.getTotalCost() + cost;
  }
  public String getDescription() {
    return component.getDescription() +
      description;
  }
}

public class CoffeeShop2 extends TestCase  {
  public void testCappuccino() {
    // В этом месте просто проверяем
    // что не было выброшено исключений.
    // Создаем простой капучино
    DrinkComponent cappuccino = new Espresso(
      new FoamedMilk(new Mug()));
    System.out.println(cappuccino.
      getDescription().trim() + ": $" +
      cappuccino.getTotalCost());
  }
  public void testCafeMocha() {
    // В этом месте просто проверяем
    // что не было выброшено исключений.
    // Создаем кофе без кофеина со взбитым
    // кремом
    DrinkComponent cafeMocha = new Espresso(
      new SteamedMilk(new Chocolate(new Whipped(
      new Decaf(new Mug())))));
    System.out.println(cafeMocha.getDescription().
      trim() + ": $" + cafeMocha.getTotalCost());
  }
  public static void main(String[] args) {
    junit.textui.TestRunner.run(CoffeeShop2.class);
  }
}


Как видите - здесь по сути создаются классы-конструкторы, реализущие один общий интерфейс.
В методе main() вы можете увидеть как в итоге "собирается" напиток.
Вот это я понимаю использование шаблона Декоратор.
Может объясните непросвященному так_глубоко в Си как реализуется здесь шаблон?
(Еще один пример система ввода-вывода в Java)
Спасибо сказали:
Аватара пользователя
serg_sk
Бывший модератор
Сообщения: 2749
Статус: <3 Anime
ОС: Gentoo Linux <3

Re: Про ООП

Сообщение serg_sk »

Для t.t: вот ты как программер, отреж программерские споры от этой темы.
Не ждали?! А я приперся!
Помойка Gentoo'шника
-------
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Про ООП

Сообщение flook »

(RuSNoteS @ Среда, 24 Августа 2005, 14:50) писал(а):Но вы же понмаете что приведенный вами код имитация использования шаблонов в Си - так же как и имитация использования классов на этом же языке.

Никакой имитации. Хотя если учесть, что у меня классы названы структурами - да имитация :) А так лучше?

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

#define class struct

:rolleyes: :rolleyes: :rolleyes:

(RuSNoteS @ Среда, 24 Августа 2005, 14:50) писал(а):Честно гворя в приведенном коде я так и не увидел реализацию шаблона декоратор.
Скажем вот эталонная (эккелевская) реализция шаблона Декоратор

А ну-ка, друг, объясни нам по-рабоче-крестьянски (без кода) что такое декоратор?

(RuSNoteS @ Среда, 24 Августа 2005, 14:50) писал(а):Может объясните непросвященному так_глубоко в Си как реализуется здесь шаблон?
(Еще один пример система ввода-вывода в Java)

Я написал 7 небольших (по 5-6 строк) кусочков кода с пояснениями. Вы - 7 экранов кода БЕЗ комментариев. Можно я не буду втыкать в то, во что Вы сами не воткнули?
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
RuSNoteS
Сообщения: 24

Re: Про ООП

Сообщение RuSNoteS »

Что такое декоратор? Пожалуйста.
Возьмем другой пример.
Мы хотим, чтобы у нас скажем был класс отвечающий за форматированный ввод-вывод, за ввод-вывод из zip-файлов, и т.п.
В общем туча классов. Мы желаем уменьшить их количество, lzk этого создаем некий интефрейс, котрый наследуют все наши классы и общий итговый обхект, отвечающий требуемым свойствам будет являться комбинаций тех нескольких классов. Удовлетворит такое объяснение?

RuSNoteS добавил в 24.08.2005 16:10

(flook @ Среда, 24 Августа 2005, 14:59) писал(а):Я написал 7 небольших (по 5-6 строк) кусочков кода с пояснениями. Вы - 7 экранов кода БЕЗ комментариев. Можно я не буду втыкать в то, во что Вы сами не воткнули?

Хорошо - можно тогда примерно работающий программы? А то яне настолкьо изощрен в применении этого шаблона, чтобы на обрывках кода разобраться используется он или нет.
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Про ООП

Сообщение flook »

То куда утек разговор не соответствует теме. Я замолкаю.

Для RuSNoteS
Считай, что я сдался.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
RuSNoteS
Сообщения: 24

Re: Про ООП

Сообщение RuSNoteS »

(flook @ Среда, 24 Августа 2005, 15:17) писал(а):То куда утек разговор не соответствует теме. Я замолкаю.

Тему же перенести хотели.

(flook @ Среда, 24 Августа 2005, 15:17) писал(а):Для RuSNoteS
Считай, что я сдался.


Жаль, жаль. Неужели просто нельзя привести пример полного кода?
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Про ООП

Сообщение alv »

(RuSNoteS @ Среда, 24 Августа 2005, 15:35) писал(а):Тему же перенести хотели.

ребята, если продолжите по делу и без наездов - перенесу в программазм
Спасибо сказали:
Аватара пользователя
alv
Бывший модератор
Сообщения: 7275
Статус: Пенсионер в законе
ОС: Cintu

Re: Про ООП

Сообщение alv »

вытащено из разборки по поводу репутаций
Спасибо сказали:
RuSNoteS
Сообщения: 24

Re: Про ООП

Сообщение RuSNoteS »

(flook @ Среда, 24 Августа 2005, 15:17) писал(а):Для RuSNoteS
Считай, что я сдался.

Хорошо - так и быть - считаю
Значит минус в вашей репутации обоснован.
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Про ООП

Сообщение d_n_k »

Для RuSNoteS:
библиотека gtk+ достаточно объектно-ориентированная?
хотя все делается через ж..., ООП в ней есть
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Про ООП

Сообщение d_Sun »

Ну вы блин даете! :) О чем спор я так и не понял :D Ну нет в С шаблонов, просто нет! Не один код преведенный выше не использует шаблоны! template - ключевое слово С++!!!
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Про ООП

Сообщение Sparky »

Да разговор не о шаблонах, как средстве языка (templates), а о шаблонах (паттернах), как методологии разработки. Та что каммент не в тему :P
Блог
--------------------

GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Про ООП

Сообщение d_Sun »

(Sparky @ Четверг, 25 Августа 2005, 8:40) писал(а):Да разговор не о шаблонах, как средстве языка (templates), а о шаблонах (паттернах), как методологии разработки. Та что каммент не в тему  :P


Ну звыняйте :) Тогда тему если переносить - то всю, с начала...

А... Прочитал с чего все началось... Действительно не в тему :)
Моя подпись сильно длинная :)
Спасибо сказали: