計算機ソフトウェア＃ 1
久野靖∗

1992.4.22

この科目の進め方について

1

この科目では今年は「オブジェクト指向プログラミング」(OOP) をテーマにしたいと思います。
内容としては予告の通り• OOP に関する論文の輪講• OOP の体験ですが、具体的には前者は OOPSLA の論文集を持ってきましたので、中から興味ありそうなものを 1 編ずつ選んでください。連休あけ (5/6) から順に 1 時間 1 人ずつ紹介していただきます。な
お、オブジェクト指向の考え方については今日簡単な紹介をやります。
後半については、まず今日 NeXT Step と Objective-C の概要を説明し、デモプログラムを見て頂きます。とりあえずこのプログラムのコピーで遊んでみて下さい。後日、機会を見て Interface
Builder のチュートリアルを (学生さん有志に講師になって頂き) やろうと思います。それが済んだ
ら IB によってアプリケーションを組み立てることがわりと簡単にできるようになると思います。
その状態に到達したら自分で好きな課題を考案してプログラムを作成してください。夏休み末くらいに〆切を設定しますので時間を掛けたい人もご安心を。
Waiver 希望の方は出席しない代わりに他の人が見て有用と思われるような論文紹介レポートまたは NeXT Step デモプログラム紹介レポートを用意して配布してください。期間は 5 月半ばくらいを考えています。それで十分「他人のためになる」ようなら Waiver を認めます。そうでない場合には残り期間を参加していただき、プログラムのレポートを出してください。
なお、出席された方には出席点を差し上げます。毎回、簡単な「質問」を用意しますので、その答えをニュースグループ gssm.lectures に

Mini-Enquete on Computer Software 4/22に投稿して下さい。それを元に集計します。

NeXT Step とその上のプログラミング

2• オブジェクト指向プログラミングの概念について• NeXT のウィンドウシステム NeXT Step について
• NeXT の基準言語 Objective-C について
• NeXT Step プログラミングのための Application Kit について
• NeXT の Interface Builder について∗

筑波大学大学院経営システム科学専攻1

3

例題 1.0: ごく簡単なアプリケーション
なお、以下の例題を動かす場合には NeXT 上で端末窓を開き、cc なんとか.m .... -lNeXT_s -lsys_sのようにして翻訳し、できあがったら例によってa.outで起動してください。
最初の例題は以下のファイル main.m だけです。
#import <appkit/appkit.h>main() {id myWin, myPanel, myMenu, winText;
NXRect aRect;[Application new];
NXSetRect(&aRect, 100.0, 350.0, 300.0, 300.0);
myWin = [Window newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_MINIATURIZEBUTTONMASK
defer: NO];
[myWin setTitle: "CompSoftDemo 1.0"];
NXSetRect(&aRect, 0.0, 0.0, 300.0, 300.0);
winText = [Text newFrame: &aRect
text: "Edit Me."alignment: NX_LEFTALIGNED];[winText setOpaque: YES];[[myWin contentView] addSubview: winText];
NXSetRect(&aRect, 100.0, 700.0, 300.0, 40.0);
myPanel = [Panel newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_CLOSEBUTTONMASK
defer: YES];[myPanel setTitle: "About CompSoftDemo"];[myPanel removeFromEventMask: (NX_KEYDOWNMASK|NX_KEYUPMASK)];
myMenu = [Menu newTitle: "CS Demo"];[[myMenu addItem: "Info..."action: @selector(orderFront:)
keyEquivalent: ’i’] setTarget: myPanel];[myMenu addItem: "Hide" action: @selector(hide:) keyEquivalent: ’h’];[myMenu addItem: "Quit" action: @selector(terminate:) keyEquivalent: ’q’];[myMenu sizeToFit];[NXApp setMainMenu: myMenu];[myWin display];[myWin orderFront: nil];[myWin makeKeyWindow];[winText selectAll: nil];[NXApp run];[NXApp free];}2

4

例題 1.1: 自分独自の View オブジェクト
今度のは main.m、TestView.h、TestView.m、の 3 つから成っています。
#import <appkit/appkit.h>#import "TestView.h"main() {id myWin, myPanel, myMenu, myView;
NXRect aRect;[Application new];
NXSetRect(&aRect, 100.0, 350.0, 300.0, 300.0);
myWin = [Window newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_MINIATURIZEBUTTONMASK
defer: NO];
[myWin setTitle: "CompSoftDemo 1.1"];
NXSetRect(&aRect, 0.0, 0.0, 300.0, 300.0);
myView = [TestView newFrame: &aRect];[[myWin contentView] addSubview: myView];
NXSetRect(&aRect, 100.0, 700.0, 300.0, 40.0);
myPanel = [Panel newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_CLOSEBUTTONMASK
defer: YES];[myPanel setTitle: "About CompSoftDemo"];[myPanel removeFromEventMask: (NX_KEYDOWNMASK|NX_KEYUPMASK)];
myMenu = [Menu newTitle: "CS Demo"];[[myMenu addItem: "Info..."action: @selector(orderFront:)
keyEquivalent: ’i’] setTarget: myPanel];[myMenu addItem: "Hide" action: @selector(hide:) keyEquivalent: ’h’];[myMenu addItem: "Quit" action: @selector(terminate:) keyEquivalent: ’q’];[myMenu sizeToFit];[NXApp setMainMenu: myMenu];[myWin display];[myWin orderFront: nil];[myWin makeKeyWindow];[NXApp run];[NXApp free];}#import <appkit/View.h>@interface TestView : View {}@end#import "TestView.h"@implementation TestView
@end3

5

例題 1.2: 自分独自のオブジェクトの機能強化
こんどは TestView.[hm] のみの変更です。
#import <appkit/View.h>@interface TestView : View {NXCoord size;
NXCoord angle;}+ newFrame: (const NXRect*)frameRect;- mouseDown: (NXEvent*)theEvent;- drawSelf: (const NXRect*)rects : (int)rectCount;@end#import "TestView.h"@implementation TestView+ newFrame: (const NXRect*)frameRect {self = [super newFrame: frameRect];size = 100.0;
angle = 0.0;
return self;}- mouseDown: (NXEvent*)theEvent {if(theEvent->flags & NX_CONTROLMASK)
angle = angle + 3.0;
else if(theEvent->flags & NX_ALTERNATEMASK)
angle = angle - 3.0;
else if(theEvent->flags & NX_SHIFTMASK)
size = size - 10.0;
else
size = size + 10.0;[self display];}- drawSelf: (const NXRect*)rects :(int)rectCount {NXRect aRect;[self translate: 150.0 : 150.0];[self rotate: angle];
NXSetRect(&aRect, -size/2.0, -size/2.0, size, size);
NXEraseRect(&aRect);
PSsetgray(NX_BLACK);NXFrameRect(&aRect);[self rotate: -angle];[self translate: -150.0 : -150.0];}@end4